『Javaの理論と実践: ファイナル・アンサー?』のメモ

ファイナル・アンサー?

記事: Javaの理論と実践: ファイナル・アンサー?

メモ:

  • 様々な final
    • クラスの final:継承禁止
    • メソッドの final:オーバーライド禁止
    • フィールドの final:コンストラクタで一度だけ代入可能。その後、変更不可。
  • Java でクラスとメソッドはむやみに final にしないほうがよい
    • パフォーマンス上の利点はない
    • final にする場合は文書化を忘れずに
  • Java でフィールドは積極的に final にする
    • パフォーマンス上の利点がある
    • 変更不可オブジェクトが作れる
  • コンストラクタ内での final フィールドの初期化が難しい場合がある
    • final に格納したいオブジェクトの生成で例外が発生した場合
    • この場合は※1のようなコードにする
  • Java の final は参照先オブジェクトに対する変更は可能

※1

public class Foo { 
  private final Thingie thingie;
  public Foo() {
    Thingie tempThingie;
    try { 
        tempThingie = new Thingie();
    }
    catch (ThingieConstructionException e) {
      tempThingie = Thingie.getDefaultThingie();
    }
    thingie = tempThingie;
  }
}

感想

基本的には継承を禁止するべきという Effective Java項目17と矛盾してない?と思った。

ケースバイケースってことかな。