15
Effective Java 輪輪輪 2013/12/04 輪輪輪 輪輪

Effective java 輪読会 第3章 項目11, 12

Embed Size (px)

DESCRIPTION

第3章 項目11, 12

Citation preview

Page 1: Effective java 輪読会 第3章 項目11, 12

Effective Java 輪読会

2013/12/04開発部 田中

Page 2: Effective java 輪読会 第3章 項目11, 12

第3章 すべてのオブジェクトに共通のメソッド(項目 11 ~ 12 )

Page 3: Effective java 輪読会 第3章 項目11, 12

• 項目 11– clone を注意してオーバーライドする

Page 4: Effective java 輪読会 第3章 項目11, 12

契約• 「 clone メソッドは、 clone が呼び出され

たオブジェクトの現在の状態をコピーして初期状態として持つ新しいオブジェクトを返します。」

• 外見は同じでも、共有はしない

Page 5: Effective java 輪読会 第3章 項目11, 12

Cloneable インターフェース• clone メソッドの実装は Object クラス• Cloneable インターフェースは空• オブジェクトの複製許可を明示

Page 6: Effective java 輪読会 第3章 項目11, 12

clone に対するアプローチ• clone をサポート• clone を条件付きサポート• サブクラスでサポートすることを想定して、

適切な clone をオーバーライドする• clone を禁止する– CloneNotSupportedException を常にスローする

Page 7: Effective java 輪読会 第3章 項目11, 12

実装上の注意 1

• コンストラクタでインスタンスを生成しない– 返すオブジェクトは常に super.clone()– Object クラスの clone メソッドを呼び出す– いずれかのスーパークラスで、コンストラク

タによるオブジェクトが帰ってくると、そのクラスより下のクラスの情報が欠落するため。

Page 8: Effective java 輪読会 第3章 項目11, 12

実装上の注意 2

• 共変戻り値型を利用– クライアントでキャストさせない

Page 9: Effective java 輪読会 第3章 項目11, 12

実装上の注意 3

• 参照型フィールドのコピーは、各フィールドを個別に複製する– オーバーライドした clone メソッドで、複製

したオブジェクトに参照を設定し直す。– 可変な final のフィールドの場合どうするか• 複製を提供しない• コピーコンストラクタ

Page 10: Effective java 輪読会 第3章 項目11, 12

変換コンストラクタ

public ArrayList(Collection<? Extends E> c) { :}

public LinkedList(Collection<? Extends E> c) { :}

Page 11: Effective java 輪読会 第3章 項目11, 12

• 項目 12– Comparable の実装を検討する

Page 12: Effective java 輪読会 第3章 項目11, 12

Comparable インターフェース• compareTo メソッド• 型パラメータ• 同一のクラス同士で、自然な順によって比

較可能

Page 13: Effective java 輪読会 第3章 項目11, 12

契約• 対称性• 推移性• 反射性• 同値検査の結果は、 equals と一致するべ

Page 14: Effective java 輪読会 第3章 項目11, 12

実装上の注意点 1

• プリミティブ型のフィールドは関係演算子で比較する。

• ただし、 Double 型と Float 型は、それぞれのクラスの compare メソッドを使う。

Page 15: Effective java 輪読会 第3章 項目11, 12

実装上の注意点 2

• フィールドが複数存在する場合は、重要なフィールドから比較する。