ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

Effective Java 第2版 項目別一文まとめ

仕事でしばらくガッツリをJavaを触ることになりそうなので
Effective Javaを再読してみました。

Effective Java 第2版 - 丸善出版 理工・医学・人文社会科学の専門書出版社

ちなみに最新の第3版ではなく、手元にあった第2版です。

こちらのEffective Javaですが

  • 各項目のタイトルがやるべきことを明示している
  • ほとんどの項目の最後にまとめがあり、そこでもより詳細なまとめが記述されている

という構成となっています。

なので読み方(使い方)としては

  • まずは一通り通読する
  • 必要に応じて項目から検索して参照する

という形になるかと思います。(もちろん精読して頭に入っている状態が一番いいでしょうが・・・)

まだ全部は読み終えていませんが、読み終わった項目については備忘録として一文で纏めてみました。
無理やり一文で纏めていることもあり、詳細は本書を参照してください。

第2章 オブジェクトの生成と消滅

  • 項目1 コントラクタの変わりにstaticファクトリーメソッドを検討する
  • 項目2 数多くのコンストラクタパラメータに直面した時にはビルダーを検討する

  コンストラクタの変わりのメソッドを作るパターンについて。

  • 項目3 privateのコンストラクタかenum型でシングルトン特性を強制する
  • 項目4 privateのコンストラクタでインスタンス化不可能を強制する

  コンストラクタを隠蔽するパターンについて。

  • 項目5 不必要なオブジェクトの生成を避ける

  staticなオブジェクトを毎回生成しないことや、プリミティブ型を使う話。

  • 項目6 廃れたオブジェクト参照を取り除く

  使用が終了したインスタンス変数にnullを代入して参照を消す例。

  • 項目7 ファイナライザを避ける

  ファイナライザの使用を避けるべき理由と、使うべき場合。

第3章 すべてのオブジェクトに共通のメソッド

  • 項目8 equalsをオーバーライドする時は一般契約に従う
  • 項目9 equalsをオーバーライドする時は、常にhashCodeをオーバーライドする

  equalsをオーバーライドをしない or するべき場合、equals・hashCodeを
  実装するルール。

  • 項目10 toStringを常にオーバーライドする

  toStringの実装について。

  • 項目11 cloneを注意してオーバーライドする

  Cloneインターフェースの注意点、Cloneを実装すべき場合 or
  するべきでない場合。

  • 項目12 Comparableの実装を検討する

  順序をもつ場合にはComparableとするべきということ

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

  • 項目13 クラスとメンバーへのアクセス可能性を最小限にする
  • 項目14 publicのクラスでは、publicのフィールドではなく、アクセッサーメソッドを使う

  フィールドの公開範囲は狭めること、private classのフィールドのみは
  publicにしてもいいこと。

  • 項目15 可変性を最小限にする

  不変オブジェクトの実装例、可変にする理由がない場合は
  クラス自体を不変クラスに・フィールドもfinalをつけて不変にするべきということ。

  一人のプログラマが管理できるような一パッケージ内の継承は安全だが、
  別パッケージの実装クラスを継承するのは危険だということ。

  • 項目17 継承のために設計および文書化する、でなければ継承を禁止する

  継承にまつわるオーバーライドの危険性、及びそれを避けるために継承を禁止すること。

  • 項目18 抽象クラスよりインタフェースを選ぶ

  複数の実装を許す型を定義するのにインターフェースは良い方法、
  骨格実装を同時に公開することで利用を助けることができる。

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

  定数の定義のためだけにインターフェースは使用すべきではないということ。

  • 項目20 タグ付クラスよりクラス階層を選ぶ

  複数の性質をタグで分けているクラスを、適切な個々のクラスに分割する例。

  • 項目21 戦略を表現するために関数オブジェクトを使用する

  Javaの関数オブジェクトの説明、使用するパターンについて。

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

  4種類のクラス内にネストしたメンバークラスと、それぞれの使用すべき場合について。

第5章 ジェネリック

  • 項目23 新たなコードで原型を使用しない

  ジェネリクスで原型を使用すると実行時にエラーとなるため
  すべきではないということ。

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

  無検査警告を取り除くこと、@SuppressWarningを使って警告を取り除く方法。

  • 項目25 配列よりリストを選ぶ

  代入する型が違う場合、配列は実行時にエラーを、
  リストはコンパイル時にエラーを吐く。

  型、メソッドでのジェネリック化の実例。

  ワイルドカード型を使用することでAPIの利用を柔軟にする。

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

  異種の型を安全に保持するコンテナーの実例。

第6章 enumアノテーション

  • 項目30 int定数の代わりにenumを使用する

  Javaenumはクラスであり、振る舞いを持つことができる。

  enumの宣言時に具体的な値も設定すること。

  • 項目32 ビットフィールドの代わりにEnumSetを使用する

  EnumSetの使用例。

  • 項目33 序数インデックスの代わりにEnumMapを使用する

  配列をインデックスするためにはEnumMapを使うこと。

  • 項目34 拡張可能なenumをインタフェースで模倣する

  インターフェースの実装としてenumを書く例。

  アノテーションの定義の例。

  意図しないバグを防ぐために@Overrideをつけるべきということ。

  • 項目37 型を定義するためにマーカーインタフェースを使用する

  マーカーインターフェースとマーカーアノテーションの使用について。

第7章メソッド

  • 項目38 パラメータの正当性を検査する

  publicのメソッドやコンストラクタではパラメータのチェックを行うこと。

  • 項目39 必要な場合には、防御的にコピーする

  オブジェクトを受け取る or 返却するメソッドを持つクラスで、不変性を維持する例。

  良いメソッドを書くために留意すべき幾つかの項目。

  オーバーロードで実行されるメソッドの決定がコンパイル時に
  行われることによる「罠」と、オーバーロードをあまり使うべきでは
  無いということ。

  • 項目42 可変長引数を注意して使用する

  可変長引数の使い方の実例。

  • 項目43 nullではなく、空配列か空コレクションを返す

  呼び出し元でのnullチェックのことも考慮し、空配列か空コレクションを返す。

  • 項目44 すべての公開API要素に対してドキュメントコメントを書く

  ドキュメントの必要性、実例とJavaDocについて。(現在だとswagger?)

第8章 プログラミング一般

  • 項目45 ローカル変数のスコープを最小限にする

  変数のスコープを最小化すべきということ。

  • 項目46 従来のfor ループよりfor-each ループを選ぶ

  Java8以降はラムダを使う?

  • 項目47 ライブラリーを知り、ライブラリーを使う

  標準ライブラリ、特にjava.lang、java.util、java.ioをよく知るべきということ。

  • 項目48 正確な答えが必要ならば、float とdouble を避ける

  金額など正確な値を求める時にはBigDecimal、int、longなどを使うこと。

  • 項目49 ボクシングされた基本データより基本データ型を選ぶ

  オブジェクト型のバグの例と、アンボクシングを使ってプリミティブ型を使う例。

  • 項目50 他の型が適切な場所では、文字列を避ける

  キーのように意味のある値には適切な型を作成すること。

  • 項目51 文字列結合のパフォーマンスに用心する

  文字列連結にはStringBuilderを使うこと。

  • 項目52 インタフェースでオブジェクトを参照する

  実装を切り替える事を考慮してインターフェースを使うべきということ。

  • 項目53 リフレクションよりインタフェースを選ぶ

  コンパイル時に分かるインターフェースや親クラスを使うべきということ。

  • 項目54 ネイティブメソッドを注意して使用する

  ネイティブメソッドは滅多に使わない、使う場合は「徹底的にテスト」すること。

  • 項目55 注意して最適化する

  速さよりより良い設計のプログラムを書き、最後にパフォーマンスチューニングを
  行うということ。

  • 項目56 一般的に受け入れられている命名規約を守る

  一般的な命名規則に従う重要性について。

第9章 例外233

  • 項目57 例外的状態にだけ例外を使用する
  • 項目58 回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する
  • 項目59 チェックされる例外を不必要に使用するのを避ける
  • 項目60 標準例外を使用する

  検査例外、実行時例外、エラーの使い方の原則。

  • 項目61 抽象概念に適した例外をスローする

  上位レイヤーで行う例外翻訳について。

  • 項目62 各メソッドがスローするすべての例外を文書化する

  例外の文章化について。

  • 項目63 詳細メッセージにエラー記録情報を含める

  例外のメッセージについて。

  • 項目64 エラーアトミック性に努める

  再実行時のいわゆる冪統性を担保すべきということ。

  • 項目65 例外を無視しない

  例外を握り潰さざるおえない時にも、最低限の例外をログなどに記録すること。