effective java 輪読会 第4章 項目13-17
TRANSCRIPT
![Page 1: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/1.jpg)
Effective Java 輪読会
2013/12/04開発部 田中
![Page 2: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/2.jpg)
第 4 章 クラスとインタフェース(項目 13 ~ 17 )
![Page 3: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/3.jpg)
• 項目 13– クラスとメンバーへのアクセス可能性を最小
限にする
![Page 4: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/4.jpg)
カプセル化• 実装と API を明確に分離する– 小さな独立した機能を組み合わせる• 並行したモジュールの開発• デバッグが容易
![Page 5: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/5.jpg)
カプセル化の手段• アクセス制御– トップレベルのクラス• API として public• 実装としてパッケージプライベート
– メンバ• 基本的にインスタンスフィールドは private• public の可変フィールドを持つクラスはスレッド
セーフではない• 例外は定数( public static final )
![Page 6: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/6.jpg)
• 項目 14– public のクラスでは、 public のフィールドで
はなく、アクセッサーメソッドを使う
![Page 7: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/7.jpg)
アクセッサー・ミューテーター• public のクラスであっても、フィールドを
直接公開すべきではない– モジュールに対するアクセスは API を通じて
行うことで、カプセル化の意味がある– フィールドに外部からアクセスする必要があ
るなら、 API としてアクセスを許可する
![Page 8: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/8.jpg)
• 項目 15– 可変性を最小限にする
![Page 9: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/9.jpg)
不変クラスの作成ルール• オブジェクトの状態を変更するメソッド
を提供しない• サブクラス化を禁止する• すべてのフィールドを final にする• すべてのフィールドを private にする• 参照型のフィールドをクラスの外からアク
セスできないようにする
![Page 10: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/10.jpg)
不変クラスの作成方法• 新たなインスタンスを戻り値にする– 関数的
• static ファクトリーメソッドで既存の不変インスタンスを共有する
![Page 11: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/11.jpg)
不変クラスのメリット• スレッドセーフ– 同期が必要ない
![Page 12: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/12.jpg)
サブクラス化防止方法• クラスを final にする• コンストラクタを private (またはパッ
ケージプライベート)にし、オブジェクトの生成は static ファクトリーメソッドで行う– static ファクトリーメソッドとしてのメリット
も有効• 同じシグネチャでも別の個性を持つオブジェクト
を生成するような場合
![Page 13: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/13.jpg)
• 項目 16– 継承よりコンポジションを選ぶ
![Page 14: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/14.jpg)
継承の危険性• クラスの拡張はスーパークラスの実装に
依存する– 意図されていない具象クラスの拡張は危険
![Page 15: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/15.jpg)
コンポジション・ラッパー• 転送クラスを通して、目的のメソッドにア
クセする– 拡張したいクラスを private のフィールドに持
ち、メソッドは全てそのフィールドに対しての呼び出し
![Page 16: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/16.jpg)
いつ継承すべきか• 「 is-a 」関係
![Page 17: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/17.jpg)
• 項目 17– 継承のために設計および文書化する、でなけ
れば継承を禁止する
![Page 18: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/18.jpg)
自己利用( self-use )を文書化• オーバーライド可能なメソッドの自己利
用を文書化していない場合、オーバーライドによってスーパークラスの振る舞いを意図せず変更してしまう恐れがある
![Page 19: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/19.jpg)
効率的なサブクラス化のために• 自己利用については記述する– 実装の詳細について記述せざるを得ない– カプセル化を破ることになる
• 可能な限りオーバーライド可能なメソッドを減らす
![Page 20: Effective Java 輪読会 第4章 項目13-17](https://reader036.vdocuments.site/reader036/viewer/2022082809/556a19cfd8b42af0198b52f4/html5/thumbnails/20.jpg)
継承を可能にするためのルール• コンストラクタはオーバーライド可能なメ
ソッドを呼び出してはならない– スーパークラスのコンストラクタから先に実
行されるため、初期化されていないサブクラスのフィールドを参照する可能性がある