[戻る]

Java読書会BOF 「Effective Java 第3版」を読む会 第3回

開催概要
日時 2019年2月15日 10:00 - 17:00
場所 川崎市教育文化会館 第3会議室
出席者(敬称略) 常念、小棚木、大部、井上、平山、山田、柴村、吉本、加藤、岩室、高橋(智)、藪下、今井(書記)

第4章 クラスとインタフェース

項目21 将来のためにインタフェースを設計する

  • JDKが変わると使用しているインタフェースにデフォルトメソッドが増えていないかチェックするのがちょっと面倒

項目22 型を定義するためだけにインタフェースを使う

項目23 タグ付きクラスよりもクラス階層を選ぶ

  • p.112: 項目20には「抽象クラスよりもインタフェースを選ぶ」とあったが、このコード例の Figure はインタフェースではだめなのか。
    • この項目としてはそこまで書いていないだけでじゃないか。
    • この例には無いが、タグ付きクラスにするようなクラスはなんらかの共通処理があるのではないか。
    • この例の出発点がクラスだったので第一段階のリファクタリングとしてクラスで、次のリファクタリングとしてインタフェースにするのでは。

項目24 非staticのメンバークラスよりもstaticのメンバークラスを選ぶ

  • p.116: 中程のプロセスオブジェクトとは何?
    • Runnable#run() のようにその場で処理を実行するだけのメソッドを持つオブジェクトのことでは?
  • ローカルクラスって使うことある?
    • 使ったことある人はいなかった。
  • p.114 最下行: エンクロージングインスタンスのnewってこんな書き方するのですね。

項目25 ソースファイルを単一のトップレベルのクラスに限定する

  • p.117 Utensilって何?
    • 器具。ここでは調理器具のことらしい。
  • Javaは一ファイルにpublic classを一つしか書けない。ScalaとかKotlinなどクラスとファイル構造の関係が自由にできるので、必要なクラスやメソッドが探しにくいのだけど、メリットってある?
    • Kotlinコード規約では、意味的に強い関連があれば同じファイル内に書くことを推奨している。
    • Kotlinでも一ファイルにpublic class一つにしていることが多い。
    • Javaを始めたときは、一ファイル一クラスで面倒だなと思った。
    • Javaの方が特殊なのか。

第5章 ジェネリックス

項目26 原型を使わない

  • p.120 l.1: コメントの「今日では原型の...」の「今日では」の意味は?
    • // 原型コレクションの型 - 今日ではこれをやってはいけない! だろう。
    • 原書には、「今日の」に対応する単語は書かれていない。
  • p.120 下方のエラーコード: '^'はこの位置に出る?

項目27 無検査警告を取り除く

  • p.126 下方のコード: elementDataをキャストして一旦ローカル変数に代入してそこにアノテーションをつけ、そのローカル変数をcopyOf()に渡すほうがアノテーションが局所化されて良いのではないか。

項目28 配列よりもリストを選ぶ

  • p.130 中程コメント: ミススペル Choose → Chooser
  • イレイジャとかイレイズは日本語には訳さないの? - コンパイラとかコンパイルみたいにこのままでもいいのでは。 - 原書ではイタリックになっているので、固有名詞的に日本語に訳さずそのままカタカナにしたのだろう。

項目29 ジェネリック型を使う

  • もしイレイズしない仕様だとしたらコンパイル時に型ごとのクラスができてしまう。

  • 可変長引数にジェネリック型を使って困ったことある?
    • あまり使ったことはないようだ。

項目30 ジェネリックメソッドを使う

項目31 APIの柔軟性向上のために境界ワイルドカードを使う

項目32 ジェネリックスと可変長引数を注意して組み合わせる

  • p.150: 中程コード下にある ClassCastExceptionpickTwo() の戻り値を attributes に代入するところで発生する。

項目33 型安全な異種コンテナを検討する

第6章 enumとアノテーション

項目34 int定数の代わりにenumを使う

  • p.167 l.11: 戦略enumは、(ストラテジーパターンのように)ストラテジーenumでいいかも。

項目35 序数の代わりにインスタンスフィールドを使う

  • p.168 最下行付近: DBなどに永続化される値は、Javaコード上でどのように定義している? enumではなく定数(final static)で定義しているのだけど。
    • 値オブジェクトを作ってそこでenumで定義すればいいのでは?
    • 値パッケージを作ってそこにenumで定義すればいいのでは?

項目36 ビットフィールドの代わりにEnumSetを使う

Note

次回はp.173から。

(以上)

[戻る]