Sto esaminando alcuni progetti Java open source per entrare in Java e noto che molti di loro hanno una sorta di interfaccia "costanti".
Ad esempio, processing.org ha un'interfaccia chiamata PConstants.java e la maggior parte delle altre classi principali implementa questa interfaccia. L'interfaccia è piena di membri statici. C'è una ragione per questo approccio o è considerata una cattiva pratica? Perché non usare le enumerazioni dove ha senso o una classe statica?
Trovo strano usare un'interfaccia per consentire una sorta di pseudo "variabili globali".
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
}
platformNamespotrebbe essere public, statice final, ma sicuramente non è una costante. L'unico array costante è uno con lunghezza zero.
static finalnon è necessariamente ridondante. Un campo classe o interfaccia con solo la finalparola chiave creerebbe istanze separate di quel campo mentre si creano oggetti della classe o dell'interfaccia. L'utilizzo static finalfarebbe sì che ogni oggetto condivida una posizione di memoria per quel campo. In altre parole, se una classe MyClass avesse un campo final String str = "Hello";, per N istanze di MyClass, ci sarebbero N istanze del campo str in memoria. L'aggiunta della staticparola chiave comporterebbe solo 1 istanza.
static finalnon è necessario, è ridondante per un'interfaccia.