คำตอบคือ ไม่พอ ต้องใช้ static final คู่กัน เพื่อสร้าง Constant ตามนิยามที่ถูกต้อง (ค่าไม่เปลี่ยน + มีเพียง 1 Copy ทั้งโปรแกรม)
ทำไม final เพียงอย่างเดียวไม่พอ?
final instance variable (ไม่มี static) จะทำให้ แต่ละ Object มี Copy ของตัวเอง แม้ค่าจะเหมือนกันก็ตาม
ตัวอย่าง: final เพียงอย่างเดียว (ไม่ใช่ Constant แท้)
class Data {
final int number = 20; // ไม่มี static
}
public class ConstantExample {
public static void main(String args[]) {
Data obj1 = new Data();
Data obj2 = new Data();
System.out.println("Obj1: " + obj1.number); // 20
System.out.println("Obj2: " + obj2.number); // 20
// แม้ค่าเหมือนกัน แต่เป็น Instance แยกกัน
System.out.println(obj1.number == obj2.number); // true (ค่าเท่ากัน)
// แต่ในหน่วยความจำเป็นตัวแปรคนละตัวกัน
}
}
ตัวอย่าง: static final (Constant แท้)
class Data {
static final int CONSTANT = 20; // มี static ด้วย
}
public class TrueConstant {
public static void main(String args[]) {
// เข้าถึงผ่าน Class ไม่ต้อง new Object
System.out.println("Value: " + Data.CONSTANT); // 20
// มีเพียง 1 Copy ใน Memory ทั้งโปรแกรม
}
}
ตารางเปรียบเทียบ
| ลักษณะ | final (Instance) |
static final (Constant) |
|---|---|---|
| Memory Copies | 1 ต่อ Object | 1 ทั้งโปรแกรม (Class Level) |
| การเข้าถึง | ต้อง new Object ก่อน | ClassName.FIELD ได้เลย |
| Compile-time Constant | ไม่ใช่ (Runtime) | ใช่ (ถ้าเป็น Primitive/String) |
| Inlining ใน Bytecode | ไม่ได้ | ได้ (Optimization) |
สรุป
- Constant จริง =
static final(Uppercase naming convention:MAX_SIZE) - Final Instance Variable = ใช้สำหรับ Immutable Fields ใน Object (เช่น ID, Config ต่อ Object)
- Java Compiler จะ Inline ค่า
static finalprimitive/string เข้าไปใน Bytecode เรียกใช้ได้เร็วขึ้น