torutkのブログ

ソフトウェア・エンジニアのブログ

Javaの命名慣習ー定数は全て大文字とする、ではイミュータブルなフィールドは?

Javaでは、定数(一般に、static final修飾子がついたフィールド)の名前は全て大文字でアンダースコアで単語間をアンダースコアで結びます。

public class JFrame extends ...
{
    public static final int EXIT_ON_CLOSE = 3;
    :
}

一方、イミュータブル(一度代入したら再代入不可)な設計をするフィールドでは、finalを使用します。クラス変数の場合はstatic finalを使用します。このとき、上述の定数がstatic finalで宣言されるので、定数とイミュータブルなクラス変数とは修飾子が同じとなり、区別があいまいになります。
例えば、ログのためのLoggerインスタンスはクラスごとに1つあればよいので、static finalで宣言します。この場合、定数の命名規約を採用するか、フィールドの命名規約を採用するか悩みが生じます。

  • 定数の命名規約を採用した場合
public class Foo {
    private static final Logger LOGGER = Logger.getLogger(Foo.class.getName());
    :
}
  • フィールドの命名規約を採用した場合
public class Foo {
    private static final Logger logger = Logger.getLogger(Foo.class.getName());
    :
}

僕個人としては、どちらかといえば意味的に後者と思っているのですが、確固たる信念には至っておらず、ちょっとグレーゾーンな感じです。