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

ทำไม Java ไม่อนุญาตให้ Initialize Static Final Variable ใน Constructor?

เพราะ 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;
    ^

เหตุผลทางเทคนิค

  1. Class Initialization เกิดขึ้นตอน Class โหลด (เข้าถึง static member แรกครั้ง)
  2. ในขั้นตอนนี้ static final ต้องมีค่าแล้ว (หรืออยู่ใน Static Block)
  3. Constructor รันตอน Object Creation (Instantiation) ซึ่งเป็นขั้นตอน หลัง Class Initialization
  4. 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 ตรงๆ