Tôi đang xem xét một số dự án Java mã nguồn mở để sử dụng Java và nhận thấy rất nhiều trong số chúng có một số loại giao diện 'hằng số'.
Ví dụ: processing.org có một giao diện được gọi là PConstants.java và hầu hết các lớp lõi khác triển khai giao diện này. Giao diện có nhiều thành viên tĩnh. Có lý do cho cách tiếp cận này, hoặc điều này được coi là thực hành xấu? Tại sao không sử dụng enum nơi nó có ý nghĩa , hoặc một lớp tĩnh?
Tôi thấy lạ khi sử dụng một giao diện cho phép một số loại 'biến toàn cục' giả.
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
có thể là public
, static
và final
, nhưng nó chắc chắn không phải là một hằng số. Mảng hằng số duy nhất là mảng có độ dài bằng 0.
static final
không nhất thiết là thừa. Một trường lớp hoặc giao diện chỉ có final
từ khóa sẽ tạo ra các thể hiện riêng biệt của trường đó khi bạn tạo các đối tượng của lớp hoặc giao diện. Việc sử dụng static final
sẽ làm cho mỗi đối tượng chia sẻ một vị trí bộ nhớ cho trường đó. Nói cách khác, nếu một MyClass của lớp có một trường final String str = "Hello";
, thì đối với N trường hợp của MyClass, sẽ có N trường hợp của trường str trong bộ nhớ. Thêm static
từ khóa sẽ chỉ dẫn đến 1 trường hợp.
static final
không cần thiết, nó là thừa đối với một giao diện.