Java
継承させることを意図するクラスを作成するときは、継承のために設計し、文書化する。 そうでない場合には継承させないようにする。 自己利用(self-use)の文書化 クラスはオーバーライド可能なメソッドの自己利用を文書化する必要がある。 個々の public …
継承よりもコンポジションを選ぶべきである。 継承の利用 継承はコードを再利用するための一般的な手法だが、常に最適なものとは限らない。 継承を安全に利用することができるのは以下の場合である。 スーパークラスもサブクラスも特定のパッケージ配下にあ…
クラスの可変性は最小限にするべきである。 不変クラス 不変クラスとは、そのインスタンスを変更できないという性質をもつクラス。 インスタンスが生成された時点ですべての情報を持っていて、インスタンスの生存期間中はそれらの情報が変化しないことが保証…
クラスがパッケージの外からアクセス可能ならば(public ならば)、ゲッターとセッターを提供するべき。 public なクラスがデータフィールドを公開すると、その内部的な表現を永久に変更できなくなる。 一方、クラスがパッケージプライベート・private のネ…
ここから第4章「クラスとインターフェス」。 クラスとインタフェースは Java の中心に位置し、抽象化の基本となる要素。 この章では、クラス・インタフェースが利用可能で、頑強で、柔軟になるような指針を議論する。 最初の項目は情報隠蔽・カプセル化に関…
Comparable インタフェースの compareTo を実装するとインスタンスが順序を持つようになる。 第3章で議論した他のメソッドとは異なり、compareTo メソッドは Object では宣言されていない。 ただし、Comparable を実装すると、多くの一般的なアルゴリズムや…
本項目では正しく機能する clone メソッドを、どのように、いつ実装するかを議論する。 Cloneable インタフェース Cloneable インタフェースはオブジェクトが複製を許可していることを示す。 ただし、Cloneable インタフェース自体は空のインタフェースであ…
toString をオーバライドして意味のある文字列を返すようにする。 toString のオーバーライド java.lang.Object は toString() を実装しているが、ユーザーにとってよい情報を返すわけではない。 Object obj = new Object(); // 「クラス名@ハッシュコード値…
equals をオーバーライドする時は、hashCode メソッドを必ずオーバーライドしなければならない。 オーバーライドしない場合、Object.hashCode の一般契約を破ることになり、HashMap、HashSet、HashTable など、hashCode の一般契約に基づくコレクションが適…
第3章『すべてのオブジェクトに共通のメソッド』に入る。 第3章は、Object.equals()、Object.hashCode()、Object.toString()、Object.clone() について、いつ、どのようにオーバーライドするかを説明する。 finalize も同様のものだが、すでに項目7で議論…
Java のファイナライザは予想不可能で、危険であり、一般的には使う必要はない。 C++ プログラマは Java のファイナライザを C++ のデストラクタと対応付けて考えてしまいがちだが、それは大きな間違いである。 C++ のデストラクタはコンストラクタに対応す…
メモリリークを回避するため廃れたオブジェクトの参照は取り除かなければならない。 C や C++ から、ガーベージコレクション(GC)を持つ言語に切り替えると、メモリ管理について考える必要がないように感じることがあるが、それは間違いだ。 次のスタック実…
機能的に同じオブジェクトを、必要になるごとに再生成するのは避ける。 よくない例 極端にだめな例としては以下の様なコードがある。 // だめな例 String s = new String("stringee"); "stringee" 自身が String オブジェクトであり、String コンストラクタ…
static のメソッドと static なフィールドだけからなるクラスを書く場合は private コンストラクタでインスタンス化不可能をクライアントに強制するべきである。 static ユティリティクラス そのようなクラスは悪く評価されていることもあるが、java.lang.Ma…
シングルトンは、手短にいえば厳密に一度しかインスタンスが生成されないクラス。 ただし、クラスをシングルトンにするとデメリットも多々あるため本当に必要な場合のみ行うこと。 伝統的なシングルトン実装 Java の リリース 1.5 より前はシングルトンを実…
多くのオプションパラメータを持つオブジェクトを生成する場合はビルダーパターンを利用することを検討する。 テレスコーピングパターン 多くのオプションパラメータが存在するとき、伝統的にはテレスコーピングコンストラクタと呼ばれるパターンが利用され…
追記:2018年2月16日 Effective Java 3rd Edition を踏まえて内容をアップデートした記事を書きました。 こちらをご覧ください。 www.thekingsmuseum.info オブジェクトを生成するため、public コンストラクタの代わりに static ファクトリーメソッドを提供…
追記:2018年1月21日 Effective Java 3rd Edition を踏まえて内容をアップデートした記事を書きました。 こちらをご覧ください。 www.thekingsmuseum.info 第一章は前置き話がメイン。 第1章:はじめに この本の特徴は多くのデザインパターンとイディオムを…