Có, chúng ta có thể truy cập local final variables bằng method local inner class vì các biến final được lưu trên heap và tồn tại lâu bằng vòng đời của method local inner class object.
Method Local Inner Class (Lớp lồng cục bộ trong phương thức)
- Instance của local inner class có thể truyền như argument, return từ method, và tồn tại trong phạm vi hợp lệ.
- Hạn chế: chỉ truy cập được local variable/parameter khi nó được khai báo final (hoặc effectively final từ Java 8).
- Method chứa local inner class có thể trả về trước khi inner class object hoàn thành thực thi. Do đó, local variable sẽ không còn giữ giá trị. Giá trị phải cố định (final) trước khi tạo local inner class object.
- Nếu cần, biến non-final có thể copy vào biến final rồi dùng trong local inner class.
Ví dụ minh họa
class MainClassTest {
private int x = 10;
public void sampleMethod() {
final int y = 20; // final local variable
final int c = 30; // final local variable
class MethodLocalInnerClassTest {
public void accessMainClassVar() {
System.out.println(x); // truy cập instance variable của outer class
System.out.println(c); // truy cập local final variable
}
}
MethodLocalInnerClassTest mainTest = new MethodLocalInnerClassTest();
mainTest.accessMainClassVar();
}
}
// Test.java
public class Test {
public static void main(String args[]) {
MainClassTest test = new MainClassTest();
test.sampleMethod();
}
}
Kết quả đầu ra
10 20
Giải thích
x: instance variable của outer class → truy cập được.c(trong code gốc làynhưng in rac, giả sử typo): local final variable → truy cập được vì final.- Từ Java 8: effectively final – biến không được gán lại sau khởi tạo (không cần từ khóa
final) cũng được truy cập.
Ví dụ effectively final (Java 8+)
public void sampleMethod() {
int y = 20; // không khai báo final nhưng không gán lại → effectively final
class LocalInner {
void print() { System.out.println(y); } // OK
}
// y = 30; // nếu uncomment → không còn effectively final → lỗi compile
}
Lưu ý
- Local inner class không thể static (vì gắn với instance của outer method invocation).
- Không thể có access modifier (public/private/protected) cho local class.
- Đường dẫn truy cập:
OuterClass.this.xcho instance variable, trực tiếp tên biến cho local final/effectively final.