Sebuah normal this
tidak pernah bisa null
dalam kode Java 1 yang sebenarnya , dan contoh Anda menggunakan normal this
. Lihat jawaban lainnya untuk lebih jelasnya.
Seorang yang memenuhi syarat this
seharusnya tidak pernah null
, tetapi mungkin untuk memecahkan ini. Pertimbangkan hal berikut:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Saat kita ingin membuat sebuah instance Inner
, kita perlu melakukan ini:
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
}
Outputnya adalah:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
menunjukkan bahwa upaya kami untuk membuat Inner
dengan null
referensi ke dalamnya Outer
telah gagal.
Faktanya, jika Anda tetap berada di dalam amplop "Java Murni", Anda tidak dapat memecahkannya.
Namun, setiap Inner
instance memiliki final
bidang sintetis tersembunyi (disebut "this$0"
) yang berisi referensi ke Outer
. Jika Anda benar-benar rumit, Anda dapat menggunakan cara "non-murni" untuk menetapkan null
ke bidang.
- Anda bisa menggunakan
Unsafe
untuk melakukannya.
- Anda dapat menggunakan kode asli (misalnya JNI) untuk melakukannya.
- Anda bisa melakukannya dengan menggunakan refleksi.
Apa pun cara Anda melakukannya, hasil akhirnya adalah Outer.this
ekspresi akan bernilai null
2 .
Singkatnya, itu adalah mungkin untuk memenuhi syarat this
untuk menjadi null
. Tetapi tidak mungkin jika program Anda mengikuti aturan "Pure Java".
1 - Saya mengabaikan trik seperti "menulis" bytecode dengan tangan dan meneruskannya sebagai Java asli, mengubah bytecode menggunakan BCEL atau yang serupa, atau melompat ke kode asli dan mengotak-atik register yang disimpan. IMO, itu BUKAN Java. Secara hipotesis, hal-hal seperti itu mungkin juga terjadi sebagai akibat dari bug JVM ... tapi saya tidak ingat setiap melihat laporan bug.
2 - Sebenarnya, JLS tidak mengatakan seperti apa perilakunya, dan bisa jadi tergantung pada implementasi ... antara lain.