ฉันกำลังดูโปรเจ็กต์ 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
ไม่จำเป็นมันซ้ำซ้อนสำหรับอินเทอร์เฟซ