Effective Java 第 2 版:第 4 章 項目 18, 19

項目 18: 抽象クラスよりインタフェースを選ぶ

インタフェースの利点

主に以下の利点がある。

  • 簡単に実装できる
  • ミックスインを実現しやすい
  • 階層になっていないフレームワークを組織できる
  • ラッパークラスイディオムを利用できる
  • 骨格実装を提供できる

骨格実装(スケルトン実装)はインタフェースとセットで提供される。 Java API における AbstractCollection 以下のクラス群がその例である。

骨格実装はインタフェースがすでに実装されている抽象クラスである。 ユーザは、骨格実装を拡張することで、おのおの独自の実装ができる。 インタフェースのメソッドが全て実装されていたら、単純クラスとよぶ。

内部で骨格実装を拡張したクラスを持っておき、インタフェースの呼び出しをそのインスタンスへ転送すると、多重継承を擬似的に実現できる。

インタフェースの欠点

インタフェース自体に拡張性がないのが欠点である。 public なインタフェースを設計するときは、広く実装されたらインタフェースを変更できないので注意が必要である。

項目 19: 型を定義するためだけにインタフェースを利用する

インタフェースに static final な定数を持たせて使うパターンは不適切である。 理由は以下の通り。

  • 定数が不必要になってもバイナリ互換性保証のため残す羽目になる
  • 定数名によって、実装したクラスの名前空間を汚される

別の方法として、関連のあるクラス、enum 型、ユーティリティクラスで提供する方法がある。

public static なフィールドは、static インポートすることで、定数名にクラス名を修飾することなく利用できる。

参考文献

EFFECTIVE JAVA 第2版 (The Java Series)

EFFECTIVE JAVA 第2版 (The Java Series)