第44回 プロパティとフィールド、よくわかりません。
実はハマりまくって、ブログ更新がおろそかに・・・
そもそも、
Kotlinのクラスは、フィールドを持つことができません。(引用1)
この一文が混乱の元になりました。
じゃあ、フィールドって何?ってなると、Java解説本では
クラスの内部の定義した変数をフィールドと呼びます。(引用2)
さらに、swift解説本では
プロパティとは、クラスや構造体に所属する変数のことです。(引用3)
私ゃ日本人なんで、クラスの中には変数や関数が定義できて変数の処理するのに関数をつかんだな〜ぐらいにしか認識してないのに、この絶望的な矛盾はなんなんだろ?
いや、引用2と引用3はいいんです。それぞれの言語で、呼び名が違うくらいはいいんです。
じゃ、Kotlinで書いたこのクラスでは
class Member(private val myId: Int) { // 選手名 var name: String? = null }
この後、名前を読み出す関数とかあるのですが、このnameはクラス内の変数に違いないが、同じ書き方であるにも関わらず、Javaでフィールドと呼び、Kotlinではプロパティと呼び、フィールドではないということらしい。
素人なもので、まあいいか〜みたいなスルーでもよかったのですが、読んでくださる方もいるわけで、調べようかと思ったらとんでもないことになりそうです。
Kotlinでは
member.name = "青木"
とすると、これは、セッターを呼び出していることになるようなんですね。つまり、直接、インスタンス変数にアクセスしていないということを言いたいようなんです。
Javaでは直接、フィールド変数にアクセスできるようで、カプセル化のため、フィールド変数をprivateにし、getter,setterを自分で書くことが多いようです。
あと、Kotlinではバッキングフィールドなる言葉が出てきて、何かしらフィールドが作られてるようなんですが・・・
本音を言ってしまえば、同じ書き方して、同じ動作をすればそれでいいんじゃないっていうところ。
ただ、人に説明する時は、内部でやってることは少し(かなり)違うんですよって付け加える必要がありそうです。
Kotlinまだ麓でウロウロってとこです。