Effective Java 第2版 項目別一文まとめ
仕事でしばらくガッツリをJavaを触ることになりそうなので
Effective Javaを再読してみました。
Effective Java 第2版 - 丸善出版 理工・医学・人文社会科学の専門書出版社
ちなみに最新の第3版ではなく、手元にあった第2版です。
こちらのEffective Javaですが
- 各項目のタイトルがやるべきことを明示している
- ほとんどの項目の最後にまとめがあり、そこでもより詳細なまとめが記述されている
という構成となっています。
なので読み方(使い方)としては
- まずは一通り通読する
- 必要に応じて項目から検索して参照する
という形になるかと思います。(もちろん精読して頭に入っている状態が一番いいでしょうが・・・)
まだ全部は読み終えていませんが、読み終わった項目については備忘録として一文で纏めてみました。
無理やり一文で纏めていることもあり、詳細は本書を参照してください。
第2章 オブジェクトの生成と消滅
コンストラクタの変わりのメソッドを作るパターンについて。
コンストラクタを隠蔽するパターンについて。
- 項目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をつけて不変にするべきということ。
- 項目16 継承よりコンポジションを選ぶ
一人のプログラマが管理できるような一パッケージ内の継承は安全だが、
別パッケージの実装クラスを継承するのは危険だということ。
- 項目17 継承のために設計および文書化する、でなければ継承を禁止する
継承にまつわるオーバーライドの危険性、及びそれを避けるために継承を禁止すること。
- 項目18 抽象クラスよりインタフェースを選ぶ
複数の実装を許す型を定義するのにインターフェースは良い方法、
骨格実装を同時に公開することで利用を助けることができる。
- 項目19 型を定義するためだけにインタフェースを使用する
定数の定義のためだけにインターフェースは使用すべきではないということ。
- 項目20 タグ付クラスよりクラス階層を選ぶ
複数の性質をタグで分けているクラスを、適切な個々のクラスに分割する例。
- 項目21 戦略を表現するために関数オブジェクトを使用する
Javaの関数オブジェクトの説明、使用するパターンについて。
- 項目22 非staticのメンバークラスよりstaticのメンバークラスを選ぶ
4種類のクラス内にネストしたメンバークラスと、それぞれの使用すべき場合について。
第5章 ジェネリックス
- 項目23 新たなコードで原型を使用しない
ジェネリクスで原型を使用すると実行時にエラーとなるため
すべきではないということ。
- 項目24 無検査警告を取り除く
無検査警告を取り除くこと、@SuppressWarningを使って警告を取り除く方法。
- 項目25 配列よりリストを選ぶ
代入する型が違う場合、配列は実行時にエラーを、
リストはコンパイル時にエラーを吐く。
型、メソッドでのジェネリック化の実例。
- 項目29 型安全な異種コンテナーを検討する
異種の型を安全に保持するコンテナーの実例。
第6章 enumとアノテーション
- 項目30 int定数の代わりにenumを使用する
Javaのenumはクラスであり、振る舞いを持つことができる。
- 項目31 序数の代わりにインスタンスフィールドを使用する
enumの宣言時に具体的な値も設定すること。
- 項目32 ビットフィールドの代わりにEnumSetを使用する
EnumSetの使用例。
- 項目33 序数インデックスの代わりにEnumMapを使用する
配列をインデックスするためにはEnumMapを使うこと。
- 項目34 拡張可能なenumをインタフェースで模倣する
インターフェースの実装としてenumを書く例。
アノテーションの定義の例。
- 項目36 常にOverrideアノテーションを使用する
意図しないバグを防ぐために@Overrideをつけるべきということ。
- 項目37 型を定義するためにマーカーインタフェースを使用する
マーカーインターフェースとマーカーアノテーションの使用について。
第7章メソッド
- 項目38 パラメータの正当性を検査する
publicのメソッドやコンストラクタではパラメータのチェックを行うこと。
- 項目39 必要な場合には、防御的にコピーする
オブジェクトを受け取る or 返却するメソッドを持つクラスで、不変性を維持する例。
- 項目40 メソッドのシグニチャを注意深く設計する
良いメソッドを書くために留意すべき幾つかの項目。
- 項目41 オーバーロードを注意して使用する
オーバーロードで実行されるメソッドの決定がコンパイル時に
行われることによる「罠」と、オーバーロードをあまり使うべきでは
無いということ。
- 項目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 例外を無視しない
例外を握り潰さざるおえない時にも、最低限の例外をログなどに記録すること。