Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Tại sao blank final variable phải được khởi tạo tường minh trong mọi constructor Java?

Blank final variable là biến final được khai báo nhưng chưa gán giá trị ngay.

Quy tắc bắt buộc

Khác với biến instance thường (được gán giá trị mặc định 0/null/false trong default constructor), blank final variable KHÔNG được gán giá trị mặc định. Compiler bắt buộc bạn phải gán giá trị cho nó trong mọi constructor của class.

Ví dụ lỗi: Thiếu khởi tạo

public class Student {
    public final String name; // Blank final
    
    public void display() {
        System.out.println("Name of the Student: " + this.name);
    }
    
    public static void main(String args[]) {
        new Student().display(); // Compile error!
    }
}
Student.java:3: error: variable name not initialized in the default constructor
    private final String name;
    ^

Đúng: Khởi tạo trong TẤT CẢ constructors

public class Student {
    public final String name;
    
    // Constructor 1
    public Student() {
        this.name = "Raju"; // Bắt buộc gán
    }
    
    // Constructor 2
    public Student(String name) {
        this.name = name; // Bắt buộc gán
    }
    
    public void display() {
        System.out.println("Name of the Student: " + this.name);
    }
    
    public static void main(String args[]) {
        new Student().display();
        new Student("Radha").display();
    }
}
Name of the Student: Raju
Name of the Student: Radha

Tại sao bắt buộc trong TẤT CẢ constructors?

Vì Java không biết constructor nào sẽ được gọi. Đảm bảo sau khi object được tạo (bằng constructor nào), mọi final field đều đã có giá trị → đảm bảo tính bất biến (immutability) và an toàn.

Mẹo: Dùng constructor chaining (this(...)) để tránh lặp code khởi tạo:

public Student() {
    this("Default Name"); // Gọi constructor kia
}

public Student(String name) {
    this.name = name; // Chỉ khởi tạo ở 1 nơi
}