Я смотрю на некоторые проекты 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";, для N экземпляров MyClass в памяти будет N экземпляров поля str. Добавление staticключевого слова приведет только к 1 экземпляру.
static finalнеобязательно, это избыточно для интерфейса.