辞書: Effective Java

投稿日: 更新日:

Effective Javaとは

定評のあるJavaの本です。 いま出ているのは第2版ですが、第3版が2018-01-07に出る予定です1。 Kindle版は既に出ています。

日本語版は出る予定ですが、時期はまだ未定のようです2

難しいが役に立つ

Effective Javaは良い本ですが、内容を理解するのは難しいです。 なぜかというと、経験しないと必要性が分からないからです。

  • 継承よりコンポジション
  • 例外の使い方

とか、何度も痛い目見てようやく理解しました3

あえて外すケースも

この本に書いてあることは基本的には正しいですが、 あえて外すケースもあります。 例えば、不正にnullが渡された時に、この本では NullPointerException(ぬるぽ)を投げるのが良いと書かれていますが、 自分は、IllegalArgumentExceptionを投げるようにしています。 こちらの方が意図がはっきりして好きだからです。

目次

  • 第1章 はじめに
  • 第2章 オブジェクトの生成と消滅
    • 項目1 コンストラクタの代わりに static ファクトリーメソッドを検討する
    • 項目2 数多くのコンストラクタパラメータに直面した時にはビルダーを検討する
    • 項目3 private のコンストラクタか enum 型でシングルトン特性を強制する
    • 項目4 private のコンストラクタでインスタンス化不可能を強制する
    • 項目5 不必要なオブジェクトの生成を避ける
    • 項目6 廃れたオブジェクト参照を取り除く
    • 項目7 ファイナライザを避ける
  • 第3章 すべてのオブジェクトに共通のメソッド
    • 項目8 equals をオーバーライドする時は一般契約に従う
    • 項目9 equals をオーバーライドする時は、常に hashCode をオーバーライドする.
    • 項目10 toString を常にオーバーライドする
    • 項目11 clone を注意してオーバーライドする
    • 項目12 Comparable の実装を検討する
  • 第4章 クラスとインタフェース
    • 項目13 クラスとメンバーへのアクセス可能性を最小限にする
    • 項目14 public のクラスでは、public のフィールドではなく、アクセッサーメソッドを使う
    • 項目15 可変性を最小限にする
    • 項目16 継承よりコンポジションを選ぶ
    • 項目17 継承のために設計および文書化する、でなければ継承を禁止する
    • 項目18 抽象クラスよりインタフェースを選ぶ
    • 項目19 型を定義するためだけにインタフェースを使用する
    • 項目20 タグ付クラスよりクラス階層を選ぶ
    • 項目21 戦略を表現するために関数オブジェクトを使用する
    • 項目22 非 static のメンバークラスより static のメンバークラスを選ぶ
  • 第5章 ジェネリックス
    • 項目23 新たなコードで原型を使用しない
    • 項目24 無検査警告を取り除く
    • 項目25 配列よりリストを選ぶ
    • 項目26 ジェネリック型を使用する
    • 項目27 ジェネリックメソッドを使用する
    • 項目28 API の柔軟性向上のために境界ワイルドカードを使用する
    • 項目29 型安全な異種コンテナーを検討する
  • 第6章 enum とアノテーション
    • 項目30 int 定数の代わりに enum を使用する
    • 項目31 序数の代わりにインスタンスフィールドを使用する
    • 項目32 ビットフィールドの代わりに EnumSet を使用する
    • 項目33 序数インデックスの代わりに EnumMap を使用する
    • 項目34 拡張可能な enum をインタフェースで模倣する
    • 項目35 命名パターンよりアノテーションを選ぶ
    • 項目36 常に Override アノテーションを使用する
    • 項目37 型を定義するためにマーカーインタフェースを使用する
  • 第7章 メソッド
    • 項目38 パラメータの正当性を検査する
    • 項目39 必要な場合には、防御的にコピーする
    • 項目40 メソッドのシグニチャを注意深く設計する
    • 項目41 オーバーロードを注意して使用する
    • 項目42 可変長引数を注意して使用する
    • 項目43 null ではなく、空配列か空コレクションを返す
    • 項目44 すべての公開 API 要素に対してドキュメントコメントを書く
  • 第8章 プログラミング一般
    • 項目45 ローカル変数のスコープを最小限にする
    • 項目46 従来の for ループより for-each ループを選ぶ
    • 項目47 ライブラリーを知り、ライブラリーを使う
    • 項目48 正確な答えが必要ならば、 float と double を避ける
    • 項目49 ボクシングされた基本データより基本データ型を選ぶ
    • 項目50 他の型が適切な場所では、文字列を避ける
    • 項目51 文字列結合のパフォーマンスに用心する
    • 項目52 インタフェースでオブジェクトを参照する
    • 項目53 リフレクションよりインタフェースを選ぶ
    • 項目54 ネイティブメソッドを注意して使用する
    • 項目55 注意して最適化する
    • 項目56 一般的に受け入れられている命名規約を守る
  • 第9章 例外
    • 項目57 例外的状態にだけ例外を使用する
    • 項目58 回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する
    • 項目59 チェックされる例外を不必要に使用するのを避ける
    • 項目60 標準例外を使用する
    • 項目61 抽象概念に適した例外をスローする
    • 項目62 各メソッドがスローするすべての例外を文書化する
    • 項目63 詳細メッセージにエラー記録情報を含める
    • 項目64 エラーアトミック性に努める
    • 項目65 例外を無視しない
  • 第10章 並行性
    • 項目66 共有された可変データへのアクセスを同期する
    • 項目67 過剰な同期は避ける
    • 項目68 スレッドよりエグゼキューターとタスクを選ぶ
    • 項目69 wait と notify よりコンカレンシーユーティリティを選ぶ
    • 項目70 スレッド安全性を文書化する
    • 項目71 遅延初期化を注意して使用する
    • 項目72 スレッドスケジューラに依存しない
    • 項目73 スレッドグループを避ける
  • 第11章 シリアライズ
    • 項目74 Serializable を注意して実装する
    • 項目75 カスタムシリアライズ形式の使用を検討する
    • 項目76 防御的に readObject を書く
    • 項目77 インスタンス制御に対しては、 readResolve より enum 型を選ぶ
    • 項目78 シリアライズされたインスタンスの代わりに、シリアライズ・プロキシを検討する

  1. 何度も遅れてるようですが。。。 ↩︎

  2. 『Effective Java Third Edition』:柴田 芳樹 (Yoshiki Shibata):So-netブログ ↩︎

  3. お察しください ↩︎

外部サイト