はじめに
らしいです。
元々はKotlinのbooleanのアクセスって変じゃない?って話で。
Kotlinの勉強会に行ってきて、その時の懇親会でJetBrainsの@yanex_ruさんと@ngsw_taroさんの間でそういう話が繰り広げられました。
(勉強会のレポはまた別で書こうかな)
@yanex_ruさんはJetBrainsでKotlinコンパイラとKotlinのAndroid対応をやっているそうです。
どういうことか
話題として、Kotlinのbooleanのプロパティアクセス変じゃない?ってなってたのは2点です。
1.JavaのbooleanのクラスフィールドがKotlinからisXxxというプロパティとしてアクセスされる
JavaとKotlinでフィールド名が変わっちゃうのは違和感ありますよ、って主張ですね。
ソースで言うと、こういうことです。
Java
public class JavaBooleanSample { private boolean hoge; private boolean fuga; public boolean isHoge() { return hoge; } public void setHoge(boolean hoge) { this.hoge = hoge; } }
Kotlin
val sample = JavaBooleanSample() // setterアクセス sample.isHoge = false // getterアクセス sample.isHoge
2.KotlinのbooleanプロパティはJavaからgetXxx、setXxxと見える
KotlinでbooleanのフィールドはisXxxになって欲しいのにsetXxx、getXxxになっちゃうよって話です。
ソースで言うと、こんな感じです。
Kotlin
class KotlinBooleanSample {
var hoge = true
}
Java
public class AccessToKotlinBooleanAccessor { public static void main(String... args) { KotlinBooleanSample sample = new KotlinBooleanSample(); // Kotlinではvar hoge = true sample.getHoge(); sample.setHoge(true); } }
Kotlinとして推奨されるのは
こういうことなんだそうです。
Kotlin
class KotlinBooleanSample {
var isFuga = true
}
Java
public class AccessToKotlinBooleanAccessor { public static void main(String... args) { KotlinBooleanSample sample = new KotlinBooleanSample(); // Kotlinではvar isFuga = true sample.isFuga(); sample.setFuga(true); }
つまり、Kotlinではbooleanのフィールド変数は
isXxxと宣言するのが正しい。
そしてJavaのフィールドのxxxはKotlinからはisXxxとしてアクセスされる、という仕様らしいです。
なぜこういう言語仕様になっているか
@yanex_ruさんによると
・isXxxというアクセスが英語の文法的に自然
・Javaとの相互互換性を考えると、やりやすい
といった理由らしいです。(懇親会でさらっと聞いたので間違ってたらすみません)
確かに、よくよく考えてみるとJavaがbooleanのアクセサメソッドの命名規約を特別扱いしてるとも考えられますもんね。
と考えるとKotlinがこういった対応をとるのは自然なのかなぁとか思いました。
サンプルソース的なもの
一応作って検証しました。
ちなみにですが、こんなことをすると競合するのかコンパイルエラーになりました
class KotlinBooleanSample { var isFuga = true // コンパイルエラー var fuga = true // コンパイルエラー }
まとめ
今まで、KotlinはなんでJavaから見る時にbooleanのアクセサをgetXxx、setXxxって
しちゃうのかなぁと思ってたんですが、謎が解けてスッキリしました。
他の言語でもこういうアプローチとってたりするらしいですね。
言語を作ってる人の話を聞くのは貴重でした。
楽しい勉強会でした!