Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ทำไม Blank Final Variable ต้อง Initialize ในทุก Constructor ใน Java?

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

  1. ไม่มี Default Value - Final variable ไม่ได้รับ Default Value (null/0/false) เหมือนตัวแปรธรรมดา
  2. ทุกเส้นทางสร้าง Object ต้อง Initialize - หากมีหลาย Constructor ทุกตัวต้อง Init มิฉะนั้นจะมีทางสร้าง Object ที่ field ยังไม่มีค่า
  3. 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 ครบถ้วน