Sebuah normal thistidak pernah bisa nulldalam 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 Innerdengan nullreferensi ke dalamnya Outertelah gagal.
Faktanya, jika Anda tetap berada di dalam amplop "Java Murni", Anda tidak dapat memecahkannya.
Namun, setiap Innerinstance memiliki finalbidang sintetis tersembunyi (disebut "this$0") yang berisi referensi ke Outer. Jika Anda benar-benar rumit, Anda dapat menggunakan cara "non-murni" untuk menetapkan nullke 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.thisekspresi akan bernilai null2 .
Singkatnya, itu adalah mungkin untuk memenuhi syarat thisuntuk 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.