Java読書会BOF「Kotlinイン・アクション」を読む会 第3回

開催概要
日時 2018年3月17日 10:00 - 17:00
場所 川崎市教育文化会館 第3会議室
出席者(敬称略) 松永、欧陽、根本、遠藤、井上、山田、常念、小棚木、平山、吉本、薮下、岩室、高橋(智)、高橋(徹)

第4章 クラス、オブジェクト、インターフェイス

4.1 クラス階層の定義

4.1.4 内部クラスとネストされたクラス:デフォルトはネストされたクラス

4.1.5 シールドクラス:限定されたクラス階層を定義する

  • リスト4.12 では、whenにelseがないとコンパイルエラーになるか?
    • コンパイルエラー(‘when’ expression must be exhaustive, add necessary ‘else’ branch)となる
  • sealed修飾子がopenを含むのは、openでないと意味がないから。
  • sealedされたクラスは、Javaのクラス(バイトコード)ではどうなるのだろう?
    • 生成されたクラスファイルを見ると、public final class として生成。
    • コンストラクタの引数にkotlin.jvm.internal.DefaultConstructorMarkerがいる。

4.2 非自明なコンストラクタやプロパティを持つクラスの宣言

4.2.1 クラスを初期化する:プライマリコンストラクタと初期化ブロック

4.2.2 セカンダリコンストラクタ:スーパークラスを別のやり方で初期化する

4.2.3 インターフェイス内で宣言されたプロパティを実装する

  • バッキングフィールドとは?
    • カスタムのgetter/setterを定義しない場合に用意されるフィールドのことでいいのでは。
  • 【誤植】p.110 リスト4.14 の5行目、閉じ丸括弧が1つ多い
    • get() = email.substringBefore(‘@’) )

4.2.4 getterとsetterからバッキングフィールドにアクセスする

4.2.5 アクセサの可視性を変更する

  • プロパティ、C#でも随分前から導入されているが、コード上の字面と実際のコード(挙動)がかけはなれるので、いいのか悪いのか微妙
    • Javaでも、.length と .length() とあって(フィールドとメソッドと)混乱するので、プロパティにいいところある
    • BigIntegerを使っていると、メソッドだけだとつらいね

4.3 コンパイラに生成されるメソッド:データクラスとクラス委譲

4.3.1 全てのオブジェクトが持つメソッド

  • 文字列表現の中の $名前 で変数の値に展開されるやつ、存在しない変数名を指定するとコンパイルエラーとなってくれる
  • リスト4.19 nullチェックと型チェックをした後は、nullでないこと、その型であることを前提にしたコードが書かれている。かしこいコンパイラだ。
  • p.117 9行目「採用面接では・・・」、仕事に就く際の面接ということでいいのかな?

4.3.2 データクラス:全てのオブジェクトが持つメソッドの自動生成された実装

  • デフォルトのハッシュコードの値は?
    • 同一インスタンス以外は異なる数値列、インスタンスのアドレスに基づく模様。
  • (Kotlinに限らず)コレクションのキーに可変オブジェクト使うと変更されたとき困るのはそのとおりだなぁと

4.3.3 クラス委譲:byキーワードを使う

  • p.121 上5行目からのリストで、プライマリコンストラクタのinnerListには、valもvarも付いていないが、これで動くのか?(コンパイルエラーにはならない)。その下のリスト4.22では、valが入った別なコードがある。

4.4 objectキーワード:クラスの宣言とインスタンスの生成の組み合わせ

4.4.1 オブジェクト宣言:簡単になったシングルトンを簡単に作る

4.4.2 コンパニオンオブジェクト:ファクトリメソッドと静的メンバの置き場所

4.4.3 通常のオブジェクトとしてのコンパニオンオブジェクト

  • p.129 リスト4.27 実行例のJSON文字列は正確にはJSONではない(キーにダブルクォート必須、値はシングルクォートではだめでダブルクォート)
  • ファクトリメソッド(Javaでは静的メソッドで実装)は、コンパニオンオブジェクトで実装
  • 静的メンバがないKotlin、静的メンバは、オブジェクト指向プログラミングとしては中途半端なのでこの思想はありかも。といってもKotlinにはトップレベル関数やプロパティがあるのだけれども。
  • コンパニオンオブジェクトは複数作れるのか?
    • 試してみたら、”Only one companion object is allowed per class”とコンパイルエラーになった

4.4.4 オブジェクト式:Kotlinによる無名内部クラスの置き換え

  • p.133 リスト4.31 無名オブジェクトからローカル変数にアクセスする で、複数回countClicksが呼ばれたら、clickCountは共有されるのか?

    • 実験結果) 無名オブジェクトのフィールドに値が格納される(Ref$IntRef型)

      外側の関数でIntRefを生成し、それを無名オブジェクトのコンストラクタに渡している

    • p.145参照

第5章 ラムダを使ったプログラミング

5.1 ラムダ式とメンバ参照

5.1.1 ラムダの紹介:関数の引数としてのコードブロック

  • 【誤植】p.137 4行目 「見きました」→「見ました」

5.1.2 ラムダとコレクション

5.1.3 ラムダ式の構文

5.1.4 スコープ内の変数アクセス

5.1.5 メンバ参照

5.2 コレクション操作のための関数型API

5.2.1 必須の関数:filterとmap

5.2.2 all、any、count、find:コレクションに述部を適用する

5.2.3 groupBy:リストのグループ化

5.2.4 flatMapとflatten:ネストされたコレクション内の要素操作

5.3 遅延コレクション操作:シーケンス

5.4 Javaの関数型インターフェイスの使用

  • 【誤植】p.166 Column 7行目 「Handle-Computation」→「HandleComputation」 英語で単語途中で改行となったときのハイフネーションがそのまま残ったとか?
  • p.166 Column 8行目 「逆コンパイルすると」とあるが、Kotlinの逆コンパイラってあるの?

本日は、p. 167 5.4.2の手前まで