Javaで定数を定義するには定数クラスを使おう
タグ: java / 初版公開: 2013-12-07

Javaで定数をまとめて定義するには、インタフェースとクラスを使う方法が考えられる。以下ではこれらをそれぞれ定数インタフェース、定数クラスと呼ぶことにする。このうち定数インタフェースは、以下の点で問題があるため、避けたほうが良い。

  • クラスが定数インタフェースを実装している事が不必要に外部に漏洩してしまう
  • 定数インタフェースが不要になった場合の変更に弱い
  • 定数インタフェースを実装したサブクラスの名前空間がすべて汚染されてしまう

このためJavaで定数をまとめて定義するには以下のような定数クラスを用いた方が良い。

package constants; // この例ではconstantsパッケージ

public class MathConstants {
	// privateコンストラクタでインスタンス生成を抑止
	private MathConstants(){} 
	
	// 定数
	public static final double PI = 3.14;
	public static final double NAPIER = 2.71;
	public static final double PYTHAGORAS = 1.41;
}

通常、この定数を参照するには、以下のようにクラス名.定数名で参照しなければならない。

import constants.MathConstants;
public class Main {
	public static void main(String[] args) {
		double area2 = 3 * 3 * MathConstants.PI;
	}
}

定数を頻繁に参照する必要があり、この表記が煩雑な場合はstaticインポート機能を使うことで、冗長な表記を避けることができる。

import static constants.MathConstants.*;
public class Main {
	public static void main(String[] args) {
		double area2 = 3 * 3 * PI;
	}
}

これなら定数インタフェースを使うメリットがないことがわかるだろう。

Javaで定数を定義する際にインタフェースとクラスどちらを使うべきかという議論は、Effective Javaの項目19に詳しい。

Effective Java 第2版 (The Java Series)
Joshua Bloch
ピアソンエデュケーション
売り上げランキング: 88,031