Pertanyaan dan skenario
Java 25 memfinalisasi Flexible Constructor Bodies (JEP 513). Jelaskan apa saja yang boleh dijalankan sebelum super(...) atau this(...) eksplisit, mengapa objek yang sedang dikonstruksi tidak boleh dibaca, dan bagaimana fitur ini memengaruhi pewarisan serta prapemrosesan argumen.
Apa yang sedang diuji oleh pewawancara
- Pemahaman tentang rantai konstruktor dan aturan keamanan bahwa instance belum diinisialisasi.
- Membedakan logika statis atau lokal yang diizinkan dari akses ilegal ke
this. - Mengenali versi preview versus versi final serta risiko migrasi source/target.
Pertanyaan klarifikasi sebelum menjawab
Klarifikasi apakah targetnya adalah fitur final JDK 25 atau preview JEP 447/482/492 sebelumnya, serta versi source, target, dan runtime proyek. Klarifikasi apakah fokusnya pada sintaksis, verifikasi JVM, atau melakukan inlining terhadap helper yang menyiapkan argumen super(...).
Kerangka jawaban 30 detik
Java tradisional mengharuskan pernyataan pertama konstruktor berupa super(...) atau this(...). Flexible Constructor Bodies mengizinkan prolog terbatas sebelum pemanggilan tersebut, seperti menghitung variabel lokal atau menginisialisasi field dari kelas saat ini, tetapi kode tidak dapat membaca atau memanggil instance yang sedang dikonstruksi atau meneruskan this yang belum diinisialisasi ke kode sembarang. Hal ini memungkinkan prapemrosesan argumen secara langsung sambil tetap menjaga urutan konstruksi superclass yang aman.
Jawaban mendalam langkah demi langkah
- Sebuah konstruktor memiliki prolog, pemanggilan konstruktor eksplisit, dan sisa body.
this(...)melanjutkan rantai kelas saat ini;super(...)masuk ke kelas induk. - Prolog dapat mendeklarasikan variabel lokal, mengevaluasi ekspresi yang independen dari state instance, dan menginisialisasi field dari kelas saat ini yang masih belum diinisialisasi. Nilai-nilai tersebut dapat dimasukkan ke argumen konstruktor.
- Prolog tidak dapat membaca field instance, memanggil method instance, menggunakan
thissebagai argumen, atau mengekspos objek yang baru diinisialisasi sebagian ke kode yang dapat diobservasi. - Kompiler dan JVM melacak field mana saja yang masih belum diinisialisasi sehingga konstruktor superclass tidak dapat mengamati urutan inisialisasi yang tidak valid. Static method dan konstanta dapat digunakan di mana aturan mengizinkannya.
- Selama migrasi, hapus helper hanya jika helper tersebut ada semata-mata untuk menyiapkan argumen
super(...); pertahankan helper yang memiliki efek samping, memiliki beberapa pemanggil, atau memiliki nilai pengujian independen. - Kompilasi dan jalankan dengan toolchain JDK 25. Proyek yang menargetkan source/target lebih lama tidak dapat begitu saja mengadopsi sintaksis ini.
class Child extends Parent {
private final String normalized;
Child(String raw) {
var value = raw.trim(); // prologue: local computation
super(value); // explicit constructor invocation
this.normalized = value;
}
}Contoh jawaban berkualitas tinggi
JEP 513 mengizinkan prolog terbatas sebelum super(...) atau this(...). Ini berguna untuk prapemrosesan argumen dan inisialisasi field kelas saat ini yang tidak bergantung pada state instance, tetapi tetap melarang pembacaan field, pemanggilan method instance, atau mengekspos this yang belum diinisialisasi. Kompiler dan JVM menjaga jaminan bahwa superclass hanya melihat state inisialisasi yang sah. Saya akan membedakan preview JEP 447/482/492 dari fitur final JDK 25 dan memeriksa versi source, target, serta runtime. Fitur ini mengurangi kebutuhan helper statis sekali pakai tanpa menghapus batasan urutan konstruktor atau keamanan pewarisan.
Kesalahan umum
- Mengatakan bahwa pernyataan apa pun boleh muncul sebelum
super(). - Mengabaikan fakta bahwa
thisbelum diinisialisasi dan membiarkan pembacaan atau pemanggilan instance. - Menyebut nomor JEP preview sebagai nomor final JDK 25.
- Mengedit kode sumber tanpa memeriksa target kompiler dan runtime penerapan (deployment).
- Menambahkan efek samping yang dapat diamati secara eksternal ke dalam prolog demi kenyamanan contoh.
Pertanyaan lanjutan dan tanggapan
Mengapa komputasi lokal diizinkan tetapi membaca this tidak?
Komputasi lokal tidak dapat mengamati objek yang baru diinisialisasi sebagian. Pembacaan field atau pemanggilan method dapat memicu dynamic dispatch, mengekspos state yang tidak lengkap, atau membiarkan logika superclass melihat invarian yang rusak.
Apakah aturan sebelum this(...) dan super(...) identik?
Keduanya dibatasi oleh konteks early-construction. this(...) melanjutkan rantai kelas saat ini dan super(...) masuk ke induk, tetapi keduanya tidak boleh mengekspos state instance sebelum inisialisasi yang sah.
Kapan sebaiknya Anda mempertahankan helper lama daripada melakukan inlining?
Pertahankan jika helper memiliki beberapa pemanggil, efek samping yang bermakna, nilai pengujian independen, atau batas modul yang jelas. Fitur ini merupakan kemampuan bahasa, bukan mandat untuk melakukan refaktorisasi.
Bagaimana cara mendukung JDK yang lebih lama?
Source/target yang lebih lama tidak dapat menggunakan sintaksis baru. Pertahankan pendekatan persiapan argumen yang ada hingga kompiler, runtime, dan matriks rilis ditingkatkan bersama-sama.