Java: フィールドの初期化について

投稿日:

デフォルト値では初期化しない

1つ目は、フィールドをデフォルト値で初期化することです。 CheckstyleではExplicitInitializationというチェックで検査可能です。 (例がひどいですが)

public class Foo {
  private int count = 0;
  private boolean isAdmin = false;
  private String message = null;
}

これはCheckstyleの説明にもありますが、 定義しなくてもデフォルト値で初期化されるので無駄です。また、 「これはC/C++のスタイルで、開発者がJavaのことを分かってない可能性がある」 という趣旨のことが書かれています。

不変が原則

じゃあデフォルト値以外ならいいかというと、 基本的には避けたほうがいいかと思います(まだちゃんと考察してないので曖昧)。

public class Foo {
  private int count = 1;
  private boolean isAdmin = true;
  private String message = "";
}

なぜかというと、自分にとっては「不変が原則、可変が例外」だからです。 できればこんな感じにしたいです。

public class Foo {
  private final int count = 1;
  private final boolean isAdmin = true;
  private final String message = "";
}

といっても定数でない限りfinalで宣言しても意味がないため、 コンストラクタで定義します。

public class Foo {
  private final int count;
  private final boolean isAdmin;
  private final String message;

  public Foo(int count, boolean isAdmin, String message) {
    this.count = count;
    this.isAdmin = isAdmin;
    this.message = message;
  }
}

もちろんfinalなので、このような書き方はできません。

public class Foo {
  private final int count = 0;
  private final boolean isAdmin = false;
  private final String message = null;

  public Foo(int count, boolean isAdmin, String message) {
    this.count = count;
    this.isAdmin = isAdmin;
    this.message = message;
  }
}

オブジェクトが可変か不変かで記述を変えるのは分かりにくいため、 自分はコンストラクタで初期化に統一した方がいいと思います。

辞書