Przyglądam się niektórym projektom Java o otwartym kodzie źródłowym, aby dostać się do Javy i zauważam, że wiele z nich ma interfejs „stałych”.
Na przykład processing.org ma interfejs o nazwie PConstants.java , a większość innych klas podstawowych implementuje ten interfejs. Interfejs jest usiany statycznymi elementami. Czy istnieje powód takiego podejścia, czy jest to uważane za złą praktykę? Dlaczego nie użyć wyliczeń, jeśli ma to sens , lub klasy statycznej?
Uważam, że dziwne jest używanie interfejsu, który pozwala na pseudo „zmienne globalne”.
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
}
platformNamesmoże być public, statici final, ale to na pewno nie jest stała. Jedyną stałą tablicą jest tablica o zerowej długości.
static finalniekoniecznie jest zbędne. Pole klasy lub interfejsu zawierające tylko finalsłowo kluczowe utworzyłoby oddzielne wystąpienia tego pola podczas tworzenia obiektów klasy lub interfejsu. Użycie static finalspowodowałoby, że każdy obiekt współdzieliłby lokalizację pamięci dla tego pola. Innymi słowy, gdyby klasa MyClass miała pole final String str = "Hello";, dla N wystąpień MyClass w pamięci byłoby N wystąpień pola str. Dodanie staticsłowa kluczowego spowodowałoby tylko 1 wystąpienie.
static finalnie jest konieczne, dla interfejsu jest nadmiarowe.