Petunjuk dan konteks
Tim ingin mengurangi impor yang berulang pada utilitas dan contoh Java, serta berencana menggunakan Deklarasi Impor Modul (Module Import Declarations) di Java 25. Jelaskan semantik, batasan, penanganan konflik, dan pemeriksaan migrasi daripada hanya mengulang sintaksis baru.
Apa yang sedang diuji oleh pewawancara
- Mengetahui bahwa impor modul mengimpor paket-paket yang diekspor oleh suatu modul, bukan sembarang komponen internal.
- Menjelaskan deskriptor modul, keterbacaan (readability), dan resolusi nama pada saat kompilasi.
- Memperhitungkan tipe dengan nama yang sama, preseden impor tipe-tunggal eksplisit, dan keterbacaan API.
- Mengusulkan strategi migrasi untuk JDK yang lebih lama, alat build, dan peninjauan kode.
Pertanyaan klarifikasi yang perlu diajukan
- Berapa JDK runtime minimum, dan apakah build chain mendukung sintaks Java 25?
- Apakah ini contoh pembelajaran, utilitas command-line, atau layanan modular jangka panjang?
- Apakah modul dependensi mengekspor paket yang dibutuhkan secara stabil, dan apakah beberapa paket mengekspos nama tipe publik yang sama?
- Apakah tim lebih mementingkan pengurangan boilerplate daripada membuat setiap dependensi dapat diaudit secara langsung?
Jawaban 30 detik
Pertama-tama saya akan mengonfirmasi bahwa kompilasi dan runtime menargetkan Java 25 atau yang lebih baru. Saya akan memperlakukan import module sebagai impor massal dari API yang diekspor suatu modul, bukan sebagai wildcard universal. Ini cocok untuk program kecil dengan dependensi yang stabil dan jelas; pustaka publik dan kode yang sensitif terhadap keamanan masih memerlukan tinjauan keterbacaan impor eksplisit. Selama migrasi, saya akan mengompilasi setiap source set, menambahkan pengujian tipe dengan nama yang sama secara sengaja, memeriksa preseden impor eksplisit, dan mempertahankan fallback JDK yang lebih lama atau gerbang pemutakhiran (upgrade gate) yang eksplisit.
Pembahasan mendalam langkah demi langkah
1. Memahami batasan impor
JEP 511 menstandarisasi deklarasi impor modul di Java 25. Deklarasi ini membawa tipe-tipe yang dapat diakses dari paket-paket yang diekspor oleh modul target ke dalam unit kompilasi saat ini; paket internal yang tidak diekspor tidak akan terlihat. Relasi requires dan keterbacaan (readability) pada sistem modul tetap mengatur akses.
2. Membedakannya dari wildcard paket
Impor modul menggunakan batasan modul dan dapat mencakup beberapa paket yang diekspor; wildcard paket mencakup satu paket. Sintaks berikut harus dikompilasi dengan kompilator Java 25:
import module java.base;
class Tool {
static void printSize(String value) {
System.out.println(value.length());
}
}Impor modul tidak mengekspos paket implementasi dan tidak menggantikan deklarasi dependensi dalam deskriptor modul.
3. Menyelesaikan konflik nama
Paket-paket terekspor yang berbeda dapat berisi nama tipe yang sama. Jika resolusinya ambigu, gunakan impor tipe-tunggal atau nama yang sepenuhnya memenuhi syarat (fully qualified name); jangan bergantung pada pilihan kompilator yang tidak disengaja. Jadikan impor eksplisit sebagai konvensi tim sehingga peninjau dapat melihat asal usul API penting. Uji benturan antara impor modul dan tipe yang terlihat secara implisit seperti yang ada di java.lang.
4. Merencanakan migrasi dan kompatibilitas
Aktifkan kompilasi Java 25 di source set yang terisolasi terlebih dahulu, lalu jalankan tugas pengujian, analisis statis, dan pengemasan secara penuh. Verifikasi bahwa IDE, pemformat kode, penganalisis, dan kompilator inkremental memahami sintaks tersebut; proyek pustaka harus mengevaluasi JDK minimum dari konsumen. Jika versi lama tetap didukung, pertahankan impor eksplisit atau isolasi sintaks baru dalam modul khusus Java 25 sehingga risiko pemutakhiran runtime tidak menyebar ke setiap layanan.
Jawaban model
Saya akan mengonfirmasi bahwa JDK minimum, kompilator, dan alat build mendukung Java 25. import module mengimpor tipe-tipe yang dapat diakses dari paket yang diekspor pada batasan modul; ini tidak dapat mengakses internal yang tidak diekspor dan tidak menggantikan requires. Fitur ini cocok untuk alat-alat kecil, contoh, atau modul dengan permukaan ekspor yang stabil. Pustaka publik dan kode yang diaudit ketat harus mempertimbangkan pengurangan boilerplate terhadap visibilitas dependensi. Saya akan mengompilasi pengujian untuk tipe bernama sama, benturan java.lang, dan preseden impor eksplisit, lalu memeriksa IDE, penganalisis, dan rantai pengemasan. Konsumen pada JDK yang lebih lama mempertahankan impor eksplisit sampai gerbang pemutakhiran dan matriks kompatibilitas diverifikasi.
Kesalahan umum
- Mengasumsikan bahwa impor modul mengekspos setiap paket di dalam modul.
- Mengasumsikan bahwa fitur ini secara otomatis menambahkan
requiresatau mengubah keterbacaan modul. - Mengabaikan tipe dengan nama yang sama di paket terekspor yang berbeda sehingga menyebabkan ambiguitas atau API yang salah.
- Hanya memutakhirkan JDK lokal tanpa memeriksa CI, IDE, pemformat, atau alat pengemasan.
- Menggunakan impor massal secara membabi buta di pustaka publik, sehingga mengurangi kemampuan audit dependensi dan kompatibilitas.
- Memublikasikan sintaks Java 25 kepada konsumen yang masih menjalankan JDK yang lebih lama.
Pertanyaan lanjutan dan tanggapan
Bagaimana Anda memilih antara impor modul dan wildcard paket?
Gunakan impor modul ketika dependensi harus dinyatakan pada batasan modul yang stabil; wildcard paket lebih sempit dan lebih mudah diaudit secara lokal. Utamakan impor tipe-tunggal eksplisit untuk API publik atau paket dengan banyak tipe bernama sama.
Apa yang terjadi jika dua tipe yang diimpor memiliki nama yang sama?
Jika beberapa kandidat cocok, kompilasi menjadi ambigu. Gunakan impor tipe-tunggal atau nama yang sepenuhnya memenuhi syarat, dan catat konvensi tersebut dalam panduan tinjauan kode daripada bergantung pada urutan impor.
Bagaimana Anda akan mendukung Java 21 dan Java 25?
Buat matriks kompilasi yang jelas. Sumber bersama mempertahankan impor eksplisit; hanya source set khusus Java 25 yang menggunakan impor modul. Sebelum merilis, verifikasi bytecode, pengujian, dan versi minimum yang diterima oleh setiap konsumen.