Biến final bắt buộc phải được khởi tạo trước khi constructor kết thúc. Java không gán giá trị mặc định cho field final (khác với field thường). Có 4 cách khởi tạo:
1. Khởi tạo tại khai báo
public class Demo {
final int MAX_SIZE = 100; // OK
}
2. Khởi tạo qua phương thức final (static hoặc instance)
final int configValue = loadConfig(); // method phải final hoặc private
final int loadConfig() {
return 42;
}
3. Khởi tạo trong constructor (phổ biến nhất cho field instance)
public class User {
final String username;
public User(String username) {
this.username = username; // BẮT BUỘC gán ở đây
}
}
4. Khởi tạo trong instance initializer block
public class Config {
final int timeout;
{
timeout = 5000; // chạy trước constructor
}
}
Ví dụ tổng hợp
public class FinalInitDemo {
final int a = 1; // 1. Tại khai báo
final int b = computeB(); // 2. Qua method
final int c; // 3. Trong constructor
final int d; // 4. Trong initializer block
{ d = 99; } // instance initializer
public FinalInitDemo(int c) {
this.c = c;
}
private final int computeB() { return 2; }
public static void main(String[] args) {
FinalInitDemo obj = new FinalInitDemo(3);
System.out.println("a=" + obj.a + ", b=" + obj.b + ", c=" + obj.c + ", d=" + obj.d);
}
}
Kết quả
a=1, b=2, c=3, d=99
Lỗi thường gặp: Quên gán field final trong constructor → compile error: variable might not have been initialized.