Ich schaue mir einige Open-Source-Java-Projekte an, um in Java einzusteigen, und stelle fest, dass viele von ihnen eine Art 'Konstanten'-Schnittstelle haben.
Zum Beispiel processing.org verfügt über eine Schnittstelle namens PConstants.java , und die meisten anderen Hauptklassen implementieren diese Schnittstelle. Die Schnittstelle ist mit statischen Elementen durchsetzt. Gibt es einen Grund für diesen Ansatz oder wird dies als schlechte Praxis angesehen? Warum nicht Enums verwenden, wo es Sinn macht , oder eine statische Klasse?
Ich finde es seltsam, eine Schnittstelle zu verwenden, um eine Art pseudo-globaler Variablen zuzulassen.
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
}
platformNamessein kann public, staticund final, aber es ist definitiv nicht eine Konstante. Das einzige konstante Array ist eins mit der Länge Null.
static finalist nicht unbedingt redundant. Ein Klassen- oder Schnittstellenfeld mit nur dem finalSchlüsselwort würde separate Instanzen dieses Felds erstellen, wenn Sie Objekte der Klasse oder Schnittstelle erstellen. Durch static finaldie Verwendung würde jedes Objekt einen Speicherort für dieses Feld gemeinsam nutzen. Mit anderen Worten, wenn eine Klasse MyClass ein Feld final String str = "Hello";hätte, wären für N Instanzen von MyClass N Instanzen des Feldes str im Speicher. Das Hinzufügen des staticSchlüsselworts würde nur zu einer Instanz führen.
static finalist nicht erforderlich, es ist für eine Schnittstelle redundant.