Upload
appresso-engineering-team
View
407
Download
2
Embed Size (px)
DESCRIPTION
第3章 項目11, 12
Citation preview
Effective Java 輪読会
2013/12/04開発部 田中
第3章 すべてのオブジェクトに共通のメソッド(項目 11 ~ 12 )
• 項目 11– clone を注意してオーバーライドする
契約• 「 clone メソッドは、 clone が呼び出され
たオブジェクトの現在の状態をコピーして初期状態として持つ新しいオブジェクトを返します。」
• 外見は同じでも、共有はしない
Cloneable インターフェース• clone メソッドの実装は Object クラス• Cloneable インターフェースは空• オブジェクトの複製許可を明示
clone に対するアプローチ• clone をサポート• clone を条件付きサポート• サブクラスでサポートすることを想定して、
適切な clone をオーバーライドする• clone を禁止する– CloneNotSupportedException を常にスローする
実装上の注意 1
• コンストラクタでインスタンスを生成しない– 返すオブジェクトは常に super.clone()– Object クラスの clone メソッドを呼び出す– いずれかのスーパークラスで、コンストラク
タによるオブジェクトが帰ってくると、そのクラスより下のクラスの情報が欠落するため。
実装上の注意 2
• 共変戻り値型を利用– クライアントでキャストさせない
実装上の注意 3
• 参照型フィールドのコピーは、各フィールドを個別に複製する– オーバーライドした clone メソッドで、複製
したオブジェクトに参照を設定し直す。– 可変な final のフィールドの場合どうするか• 複製を提供しない• コピーコンストラクタ
変換コンストラクタ
public ArrayList(Collection<? Extends E> c) { :}
public LinkedList(Collection<? Extends E> c) { :}
• 項目 12– Comparable の実装を検討する
Comparable インターフェース• compareTo メソッド• 型パラメータ• 同一のクラス同士で、自然な順によって比
較可能
契約• 対称性• 推移性• 反射性• 同値検査の結果は、 equals と一致するべ
き
実装上の注意点 1
• プリミティブ型のフィールドは関係演算子で比較する。
• ただし、 Double 型と Float 型は、それぞれのクラスの compare メソッドを使う。
実装上の注意点 2
• フィールドが複数存在する場合は、重要なフィールドから比較する。