Blank Final Variable คือ final variable ที่ ไม่ได้กำหนดค่าตอนประกาศ Java บังคับให้ Initialize ใน ทุก Constructor เพื่อให้แน่ใจว่า Object ทุกตัวที่สร้างขึ้นมีค่าที่ถูกต้องเสมอ
ตัวอย่างที่ Error (ไม่ได้ Initialize)
public class Student {
public final String name; // Blank final
public void display() {
System.out.println("Name: " + this.name);
}
public static void main(String args[]) {
new Student().display(); // Compile Error
}
}
Compile Error
Student.java:3: error: variable name not initialized in the default constructor
public final String name;
^
ตัวอย่างที่ถูกต้อง: Initialize ในทุก Constructor
public class Student {
public final String name;
// Constructor 1: Default
public Student() {
this.name = "Raju"; // Initialize
}
// Constructor 2: Parameterized
public Student(String name) {
this.name = name; // Initialize
}
public void display() {
System.out.println("Name: " + this.name);
}
public static void main(String args[]) {
new Student().display(); // Name: Raju
new Student("Radha").display(); // Name: Radha
}
}
ผลลัพธ์
Name: Raju Name: Radha
เหตุผลที่บังคับทุก Constructor
- ไม่มี Default Value - Final variable ไม่ได้รับ Default Value (null/0/false) เหมือนตัวแปรธรรมดา
- ทุกเส้นทางสร้าง Object ต้อง Initialize - หากมีหลาย Constructor ทุกตัวต้อง Init มิฉะนั้นจะมีทางสร้าง Object ที่ field ยังไม่มีค่า
- Definite Assignment Analysis - Compiler ตรวจสอบว่า Final variable ถูก Assign ทุก Path การสร้าง Object
ทางเลือกอื่น
- Initialize ตอนประกาศ:
final String name = "Default";(กลายเป็นไม่ใช่ Blank Final) - ใช้ Instance Initializer Block:
{ name = "Default"; }(รันทุก Constructor)
สรุป
Blank Final Variable = Final variable ที่ไม่มีค่าเริ่มต้น ต้อง Initialize ใน ทุก Constructor หรือ Instance Initializer Block เพื่อให้ Compiler รับรองว่า Object ทุกตัวมีค่า Final Field ครบถ้วน