Я дивлюся на якісь проекти Java з відкритим кодом, щоб потрапити на Java і зауважую, що багато з них мають якийсь інтерфейс "константи".
Наприклад, processing.org має інтерфейс під назвою PConstants.java , і більшість інших основних класів реалізують цей інтерфейс. Інтерфейс пронизаний статичними членами. Чи є причина такого підходу, чи це вважається поганою практикою? Чому б не використовувати enums там, де це має сенс , або статичний клас?
Мені здається дивним використовувати інтерфейс, щоб передбачити якусь псевдо «глобальну змінну».
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не потрібно, це зайве для інтерфейсу.