Một bình thường this
bao giờ có thể null
trong mã Java thực , và ví dụ của bạn sử dụng một bình thường this
. Xem các câu trả lời khác để biết thêm chi tiết.
Đủ điều kiện this
nên không bao giờ là null
, nhưng có thể phá vỡ điều này. Hãy xem xét những điều sau đây:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Khi chúng tôi muốn tạo ra một thể hiện của Inner
, chúng ta cần phải làm điều này:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
Đầu ra là:
outer is [email protected]
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
cho thấy nỗ lực của chúng tôi để tạo một số Inner
với tham chiếu null
vào số Outer
của nó không thành công.
Thực tế, nếu bạn dính trong phong bì "Pure Java", bạn không thể phá vỡ nó.
Tuy nhiên, mỗi trường hợp Inner
có trường tổng hợp ẩn final
ẩn (được gọi là "this$0"
) có chứa tham chiếu đến Outer
. Nếu bạn thực sự khó khăn, có thể sử dụng "không thuần khiết" có nghĩa là chỉ định null
cho trường này.
- Bạn có thể sử dụng
Unsafe
để thực hiện.
- Bạn có thể sử dụng mã gốc (ví dụ: JNI) để thực hiện.
- Bạn có thể làm điều đó bằng cách sử dụng phản chiếu.
Dù bằng cách nào bạn làm điều đó, kết quả cuối cùng là sự biểu hiện Outer.this
sẽ đánh giá để null
.
Tóm lại, nó là có thể cho một đủ điều kiện this
là null
. Nhưng đó là không thể nếu chương trình của bạn tuân thủ các quy tắc "Pure Java".
1 - Tôi giảm giá thủ đoạn như "viết" các bytecode bằng tay và đi qua chúng như Java thực, tinh chỉnh bytecode sử dụng BCEL hoặc tương tự, hoặc nhảy vào mã nguồn gốc và lừa gạt chính các thanh ghi lưu. IMO, đó KHÔNG phải là Java. Theo giả thuyết, những thứ như vậy cũng có thể xảy ra do lỗi JVM ... nhưng tôi không nhớ mọi báo cáo lỗi đang thấy.
2 - Thực ra, JLS không nói hành vi sẽ là gì và có thể phụ thuộc vào việc triển khai thực hiện ... trong số những thứ khác.
Luôn chế giễu trước và đặt câu hỏi sau. Thật dễ dàng để xin lỗi hơn là lấy lại một cơ hội vàng để xé một ai đó xuống trong một loạt đá sa thạch. –
Tôi cũng nghĩ vậy ... Thực ra phải kiểm tra chú thích để đảm bảo nó không phải là của tôi ... Đã bao nhiêu lần tôi viết: –
+1 cho thuật ngữ "flurry of brimstone". –