19.0425

アクセサー(Accessor)

アクセサー とは、
  プロパティ
の、
  設定 と 取得(ゲットすること)
のために、
  たとえ、プログラマー が、書かなくても
  実は、Kotlin が、書いてくれている、関数/メソッド
のことです。
ここで、「たとえプログラマーが書かなくても」 と言いましたが、
と言うよりは、書かない方が、普通だと思われます。


1. アクセサー の、コードを理解する
まず、超簡単なコードで、実際に、アクセサー を、書いてみました
このコードの、
  4~9行目
が、普通は、Kotlin が、勝手に書いてくれる
(コンパイル後の、バイトコードには、きっと書かれているでしょう)、
  アクセサー
なのですが、そして、関数なのですが、
そして、関数なのに、
  関数のコード規則に従って書いても、
  エラーになってしまう
という、少し、理解を超えてしまう部分はあります。

ただ、7行目は、普通は、
  value(慣習として)
と、書かれる部分は、アレンジして、
  intValue
と、書いても、OKでした。
ですから、ここは、
  v
だって、OKです(ここは、確かめました)。

その他の部分は、もし、書く機会があるとしたら、
  このコードにあるのと、
  全く同じスタイル(タブ の、長さとかは、関係ないです)
で、書きましょう。
ひょっとして、まだ、アレンジ可能な部分があるかもしれませんが、
まあ、それを探求しても、しょうがないとは思います。

特に気を付けるところは、
  ・ set(), get() は、プロパティ/フィールド の直後に書いて、関連付ける
  field(キーワードです)とは、その前に書かれている、プロパティ です
ですが、ここで、もう一度確認しておきますと、
  get()/get関数 とは、プロパティ を、取得する関数です。
  set()/set関数 とは、プロパティ を、設定する関数です。
さらに、もう一つ確認しますが、これを書いたからと言って、
  前回、書いたコードと同じです。
  無理やり、set や、get を、使ってやっても、失敗すると思います(私は、失敗しました)。
    / 例えば、15行目の、mike.age = 9
    / 18行目の、val a: Int = mike.age
のように、普段通り書いてください。
あと、この2つのコードで、
  15行目は、set関数 に、なって、
  18行目は、get関数 になるのは、
    演算子 というのは、
    右から左へと、代入する、、演算子だからです。
      / その流れで、考えれば、どちらが、set() なのか get() なのかが、分かるでしょう。


set関数/setter、get関数/getter と、同じ事を、書いてみる
ひょっとして、Java とか、全然知らない人が読んだら、何を書いているのか、
全然分からない気がしてきましたので、
ここで、set関数/get関数 を、Java流(Javaは、省略がないので、理屈は、理解しやすいでしょう)で、
書いてみました。
ただ、getName() などの名前にすると、エラーになったり、
fieldキーワード を使うと、これまた、エラーになりますので、
苦肉の策として、setN() 、getN で、fieldキーワード には、this.name
で、対応しました。
ここでは、setN()メソッド の、引数の名前 と、かぶらないので、必要はなかったのですが、
thisキーワード を、使いました。
thisキーワード は、フィールド/プロパティ であることを示す、
簡単な方法で、可読性も、向上すると思います。
こんなコードに、なります
ここで、Catクラス に、もう一つ、プロパティ name を、増やして、
set関数/get関数 と、同じことを、Kotlin流 でない方法で、書いたのが、
  22行目~28行目
です。
そして、それを、使っているコードが、
  41~45行目
です。
これを見てみれば、set関数/get関数 とは、何かを、分かると思います。
もし、分からなかったら、関数 のところの、復習をしてみましょう。
setN()関数 で、「返す型」 が、書いてないのは、
何も返さない時は、省略できるからです(書くとしたら 「: Unit」 です)。


本来、field/プロパティ は、後から学習する、private を、使うべきなのですが、
学習すべきが、増えすぎるのは、よくないので、ここでは、省略してあります。
アクセサー のコードについては、こんなところですが、
書くコード も、同じなら、
(同じ、、というのは、前回の 「●まとめ」 の、
   class の、プロパティ に、アクセスするには、
     インスタンス変数.プロパティ
   のように、アクセスします。
 のところです)
なぜこんなことを、知る必要があるのか?という話になってしまいますので、
  「やさしいKotlin入門」
を読んで、難しい例は、私もなんかよく分からなかったので、
とても、簡単な例だけあげさせていただきます。


2. set関数 を、わざわざ書く、簡単な例
こんなコードを書きました
普通は書く必要のない、set関数 を、わざわざ書く場合は、
暗黙の/プログラマが実際には書いていないが存在する set関数 に、
  set関数 を、呼び出した時、
  ついでにやって欲しいことが、ある場合
などが、考えられます(「やさしいKotlin入門」 では、デバッグなどの例がありました)。
ここでは、「猫の4歳というのは、人間だと何歳に当たるのか?」 を、
説明したいという理由で、「わざわざ」set関数 を、書いています。
普通の、set関数 に、
  14~21行目
に、そのためのコードを書き加えています。



まとめ
・ ここは、話が高度なので、「アクセサー」 とは、何かだけ知っておいてください。