==Effective Java==
[[Java]][[http://www.amazon.co.jp/gp/product/489471499X?ie=UTF8&tag=typea09-22&linkCode=as2&camp=247&creative=7399&creativeASIN=489471499X Effective Java 第2版]] から、メモ
{{amazon|489471499X}}
|}
<<blockquote>>抽象化の恩恵をあきらめずに、インスタンス化可能なクラスを拡張して、equals 契約を守ったまま、値要素を追加する方法はない。<</blockquote>>
===equals をオーバーライドする時は、常に hashCode をオーバーライドする===
====hashCode の実装例====
##boolean なら (f?1:0)
##byte,char,short,int なら、(int)f
##long なら、(int)(f^(f>>>>32))
##float なら、Float.floatToIntBits(f)
##double なら、Double.doubleToLongBits(f) を行い、long と同様の変換
}
<<blockquote>>Eclipse でオブジェクトのコンテキストメニュー - Source - Generate hashCode() and equals() で自動生成出来る<</blockquote>>
===toString()を常にオーバーライドする===
*優れたtoString()を実装するとクラスが使いやすくなる
===clone を注意してオーバーライドする===
<<blockquote>>インターフェースは Cloneable を拡張すべきではなく、継承されるように設計されたクラスでは、Cloneable を実装すべきでない<</blockquote>>
*コピーを行う代替手段を提供するか、コピーしないほうがよい
*上手い方法は、コピーコンストラクタか、コピーファクトリーを提供すること。
=====equals メソッドの一般契約に似た契約=====
*sgn(x.compareTo(y) == -sgn(y.compareTo(x)) であること
*x.compareTo(y) > > 0 && y.compareTo(z) は、x.compareTo(z) > > 0 であること
*x.compareTo(y)== 0 が、sgn(x.compareTo(z) == sgn(y.comareTo(z)) であること
*x.compareTo(y) なら、x.equals(y) であることを推奨
<<blockquote>>equals と同様、オブジェクト指向の抽象化による恩恵をあきらめずに、インスタンス化可能クラスを拡張して、compareTo 契約を守ったまま、値要素を追加する方法はない。<</blockquote>>
==クラスとインターフェース==
===クラスとメンバーへのアクセス可能性を最小限にする===