私はJavaにアクセスするためにいくつかのオープンソースのJavaプロジェクトを調べています。それらのプロジェクトの多くはある種の「定数」インターフェースを持っていることに気づきます。
たとえば、processing.orgにはPConstants.javaというインターフェースがあり、他のほとんどのコアクラスがこのインターフェースを実装しています。インターフェースは静的メンバーでなぞられています。このアプローチには理由がありますか、それとも悪い習慣と見なされていますか?意味のある列挙型、または静的クラスを使用しないのはなぜですか?
インターフェイスを使用して、ある種の疑似「グローバル変数」を許可するのは奇妙です。
public interface PConstants {
// LOTS OF static fields...
static public final int SHINE = 31;
// emissive (by default kept black)
static public final int ER = 32;
static public final int EG = 33;
static public final int EB = 34;
// has this vertex been lit yet
static public final int BEEN_LIT = 35;
static public final int VERTEX_FIELD_COUNT = 36;
// renderers known to processing.core
static final String P2D = "processing.core.PGraphics2D";
static final String P3D = "processing.core.PGraphics3D";
static final String JAVA2D = "processing.core.PGraphicsJava2D";
static final String OPENGL = "processing.opengl.PGraphicsOpenGL";
static final String PDF = "processing.pdf.PGraphicsPDF";
static final String DXF = "processing.dxf.RawDXF";
// platform IDs for PApplet.platform
static final int OTHER = 0;
static final int WINDOWS = 1;
static final int MACOSX = 2;
static final int LINUX = 3;
static final String[] platformNames = {
"other", "windows", "macosx", "linux"
};
// and on and on
}
platformNames
ことがありpublic
、static
そしてfinal
、それは間違いなく一定ではありません。唯一の定数配列は、長さがゼロの配列です。
static final
必ずしも冗長ではありません。final
キーワードのみのクラスまたはインターフェースフィールドは、クラスまたはインターフェースのオブジェクトを作成するときに、そのフィールドの個別のインスタンスを作成します。を使用static final
すると、各オブジェクトがそのフィールドのメモリ位置を共有します。言い換えると、クラスMyClassにフィールドがあったfinal String str = "Hello";
場合、MyClassのN個のインスタンスに対して、フィールドstrのN個のインスタンスがメモリに存在します。static
キーワードを追加すると、インスタンスは1つだけになります。
static final
必須ではありません。インターフェースにとっては冗長です。