เพราะ static final ถูกจัดว่าเป็น Compile-time Constant ต้องมีค่าตอนที่ Class ถูก Initialize (Class Initialization) ซึ่งเกิดขึ้น ก่อน ที่ Constructor จะถูกเรียก
ตัวอย่างที่ทำให้เกิด Compile Error
class Data {
static final int NUM;
Data(int i) {
NUM = i; // Compile Error: cannot assign a value to final variable
}
}
public class ConstantsExample {
public static void main(String args[]) {
System.out.println("Value: " + Data.NUM);
}
}
Error
ConstantsExample.java:4: error: cannot assign a value to final variable NUM
NUM = i;
^
เหตุผลทางเทคนิค
- Class Initialization เกิดขึ้นตอน Class โหลด (เข้าถึง static member แรกครั้ง)
- ในขั้นตอนนี้
static finalต้องมีค่าแล้ว (หรืออยู่ใน Static Block) - Constructor รันตอน Object Creation (Instantiation) ซึ่งเป็นขั้นตอน หลัง Class Initialization
- Java Compiler เห็นการ Assign ใน Constructor ว่าเป็น "Reassignment" ของ final variable จึง Error
วิธีแก้ไขที่ถูกต้อง
1. Initialize ตอนประกาศ (แนะนำสำหรับค่าคงที่ง่าย)
static final int NUM = 1000;
2. Static Block (สำหรับ Logic ซับซ้อน)
class Data {
static final int NUM;
static {
// Complex initialization logic
NUM = computeInitialValue();
}
private static int computeInitialValue() {
return 1000;
}
}
ผลลัพธ์
Value: 1000
สรุป
static finalต้อง Initialize ภายใน Class Initialization Phase- Constructor อยู่ใน Object Initialization Phase (ภายหลัง)
- ใช้ Static Block สำหรับ Logic ที่ซับซ้อนกว่าการ Assign ตรงๆ