Java プログラミング言語では、定数インターフェースパターンは、定数を定義するためだけにインターフェースを使用し、クラスがそのインターフェースを実装することで、それらの定数に構文的に簡単にアクセスできるようにすることを説明しています。しかし、定数は多くの場合単なる実装の詳細であり、クラスによって実装されるインターフェースはそのクラスのエクスポートされた API の一部であるため、この方法は実装の詳細を API に組み込むことになり、Java 設計者のJoshua Bloch氏などによって不適切だと考えられていました。[ 1 ]一般的に、動作とは無関係にシステム定数をクラスにまとめることは、凝集度が低いことの兆候であることが多いため、オブジェクト指向設計としては不適切になる可能性があります。これらの理由から、定数インターフェースはアンチパターンと見なされることがあります。
このパターンを使用することには、他にもいくつかの欠点があります。
Javaライブラリ自体が定数インターフェースパターンを使用していることに注意してください。たとえば、SwingConstantsインターフェース[ 2 ]は1998年にリリースされ[ 3 ]、当時は妥当な選択でした。
パブリックインターフェース定数{double PI = 3.14159 ; double PLANCK_CONSTANT = 6.62606896e-34 ; }public class Calculations implements Constants {public double getReducedPlanckConstant () { return PLANCK_CONSTANT / ( 2 * PI ); } }パブリックインターフェース定数{public static final int CONSTANT = 1 ; }public class Class1 implements Constants {public static final int CONSTANT = 2 ; // *public static void main ( String args [] ) throws Exception { System . out . println ( CONSTANT ); } }アスタリスク(*)が付いた行を追加する前は、Class1を実行すると1が出力されます。その行を追加した後は、Class1は2を出力します。どちらのバージョンも警告やエラーなくコンパイルされます。
アンチパターンの多くの落とし穴は、定数インターフェースを静的属性を持つクラスに変換することで回避できます。
public final class Constants {private Constants () { // インスタンス化を制限する}public static final double PI = 3.14159 ; public static final double PLANCK_CONSTANT = 6.62606896e-34 ; }Java 5以降では、静的インポート[ 4 ]を使用することで、定数修飾子なしで定数を使用できるようになります。
import static Constants.PLANCK_CONSTANT ; import static Constants.PI ;public class Calculations {public double getReducedPlanckConstant () { return PLANCK_CONSTANT / ( 2 * PI ); } }定数は、`import static Constants.*`ステートメントを使用することで一括インポートすることもできます。これにより、インターフェースを使用する場合と同じ目的が達成され、修飾子なしで定数を参照できるようになります。
上記の問題点は、程度の差こそあれ、現在では解決されている。
ただし、これらの変更はConstants クラスの凝集度を向上させるものではなく、定数の値が意図せずサイレントに変更されるのを防ぐものでもないため、静的インポートは万能薬とは考えない方が良いでしょう。