Finalize

概要

変更が行われていない変数の宣言時などに final 宣言などを行うことによって獲得できる実績です. 変数を宣言する際などに変更を不可能にすることによって,コードが単純になり,性能の改善に繋げることができます.

タイトル
Put all your eggs in one basket

この実績には,以下の4つのルールが含まれます:

  • FinalFieldCouldBeStatic
  • ImmutableField
  • LocalVariableCouldBeFinal
  • MethodArgumentCouldBeFinal

FinalFieldCouldBeStatic

final 宣言されているフィールドがコンパイル時に定数を代入されている場合, static 宣言することによってプログラムの性能を改善することができます.

コード例

public class Foo {
  public final int BAR = 42; // !!! static 宣言できます
}

このルールのチェックには,PMDの FinalFieldCouldBeStatic を用いています.

ImmutableField

コンストラクタやフィールド宣言で一度だけ初期化され,その後は変更が行われていないプライベートフィールドは, final 宣言する方が好ましいです.

コード例

public class Foo {
  private int x; // !!! final 宣言できます
  public Foo() {
     x = 7;
  }
  public void foo() {
    int a = x + 2;
  }
}

このルールのチェックには,PMDの ImmutableField を用いています.

LocalVariableCouldBeFinal

一度しか代入されていないローカル変数は final 宣言することが好ましいです.

コード例

public class Bar {
  public void foo () {
  // !!! txtA が一度しか代入されていないなら final 宣言を行いましょう
  String txtA = "a";

  final String txtB = "b";
  }
}

このルールのチェックには,PMDの LocalVariableCouldBeFinal を用いています.

MethodArgumentCouldBeFinal

再代入されていない引数は final 宣言することが好ましいです.

コード例

public void foo (String param) {       // !!! param に値が再代入されていないなら final 宣言できます
  doSomething();
}

public void bar (final String param) {
  doSomething();
}

このルールのチェックには,PMDの MethodArgumentCouldBeFinal を用いています.

ちなみに

プログラミングを行う上での重要な概念に, イミュータビリティ ( Immutability )というものがあります. mutable は可変であることを意味し, immutable はその逆の不変であることを意味します. final 宣言等を行うと,そのオブジェクトはイミュータブルになります.

イミュータブルなオブジェクトは,生成されると値が変わらないことが保証されています.メソッドの引数などでイミュータブルなオブジェクトを受け取っても, そのオブジェクトの中身はメソッド内の他の処理を通ったとしても変更されることがありません. これにより,メソッド内で変更されるものは戻り値で受け取った変数だけになるため,デバッグしやすくなり,コードの見通しが良くなります.

参考文献: