Konsep dan cakupan
Tim Anda sedang mengevaluasi fitur pratinjau Java 25 untuk pola tipe primitif di instanceof, switch, dan pola record. Kode menerima nilai Number dari parser dan harus mengklasifikasikan kasus bilangan bulat dan floating-point tanpa narrowing yang tidak disengaja atau kegagalan null. Jelaskan aturan bahasa, tulis contoh kecil, serta berikan keputusan kompatibilitas dan peluncuran (rollout).
JEP 507 adalah fitur pratinjau (preview feature) di Java 25. Jawaban yang baik harus menyatakan bahwa sintaks pratinjau memerlukan flag kompilator dan runtime yang eksplisit, serta tidak secara otomatis menjadi kontrak produksi yang stabil.
Apa yang sedang diuji oleh pewawancara
- Apakah Anda membedakan pola referensi dari pola primitif dan konversi boxing.
- Apakah Anda dapat menjelaskan widening yang aman, narrowing yang tidak aman, dan hilangnya informasi.
- Apakah Anda menangani
null,NaN, tak hingga (infinity), dan tipe selektor secara eksplisit. - Apakah Anda memahami perilaku switch yang lengkap (exhaustive) dan batas kompatibilitas fitur pratinjau.
- Apakah Anda dapat merancang pengujian dan fallback daripada sekadar mengadopsi sintaks karena terlihat lebih ringkas.
Pewawancara mencari aturan dan contoh tandingan (counterexamples), bukan daftar nomor JEP.
Klarifikasi yang perlu ditanyakan terlebih dahulu
- Apakah proses build diizinkan menggunakan fitur pratinjau di CI dan produksi? Jika tidak, solusinya harus menggunakan pola era Java 21 atau konversi eksplisit.
- Apakah “mengklasifikasikan angka” mempertahankan nilai asli, atau apakah hasil bilangan bulat berbatas (bounded integer) dapat diterima? Hal itu menentukan apakah narrowing sah.
- Apakah
nullharus ditolak, dipetakan keUNKNOWN, atau ditangani oleh cabang switch khusus? - Apakah
NaNdan nilai tak hingga merupakan input yang valid? Pencocokan tipe numerik tidak mengubahnya menjadi nilai hingga biasa. - Apakah kode sumber yang sama harus dapat dikompilasi pada JDK non-pratinjau? Jika ya, isolasi kode pratinjau di balik modul atau pertahankan implementasi yang stabil.
Kerangka jawaban 30 detik
“Pratinjau JEP 507 Java 25 memungkinkan pola menyebutkan tipe primitif dalam konteks yang sebelumnya memerlukan boxing atau guard yang rumit. Kompilator mengizinkan konversi yang aman di bawah aturan pola dan menolak narrowing yang dapat menghilangkan informasi. Saya akan menangani null sebelum pencocokan primitif, menguji nilai batas seperti Integer.MAX_VALUE, NaN, dan tak hingga, serta mempertahankan flag pratinjau di toolchain. Jika deployment tidak dapat mengunci Java 25 dengan pratinjau diaktifkan, saya akan menggunakan switch yang stabil atau konversi terverifikasi yang eksplisit sebagai gantinya.”
Solusi langkah demi langkah
1. Mulai dengan tipe statis nilai
Kompatibilitas pola bukanlah izin untuk mengonversi setiap angka ke setiap tipe primitif. Referensi Number dapat berisi Integer, Long, Double, atau implementasi lainnya. Pola yang pertama-tama mengenali pembungkus referensi dan kemudian melakukan unboxing mempertahankan kontrak yang berbeda dari pola tipe primitif atas selektor primitif. Sebutkan tipe selektor dan arah konversi sebelum mendiskusikan kelengkapan (exhaustiveness).
static String classify(Number value) {
if (value == null) {
return "missing";
}
return switch (value) {
case Integer i -> "int:" + i;
case Long l -> "long:" + l;
case Double d when Double.isNaN(d) -> "nan";
case Double d -> "double:" + d;
default -> "other";
};
}Contoh stabil ini mencocokkan tipe wrapper. Contoh ini tidak mengklaim bahwa setiap Number dapat dipersempit (narrowing) secara aman ke int.
2. Jelaskan widening versus narrowing
JEP 507 meregulasi pola primitif sehingga pola dapat mencocokkan nilai primitif ketika konversinya aman untuk variabel pola. Memperluas (widening) int ke long mempertahankan setiap nilai. Mempersempit (narrowing) long ke int dapat membuang bit tingkat tinggi, sehingga pola yang secara diam-diam menerima konversi semacam itu tidak aman. Jawaban harus menyebutkan konversi yang ditolak dan mengusulkan pemeriksaan rentang eksplisit jika narrowing merupakan kebutuhan bisnis.
static String bucket(long value) {
if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) {
int narrowed = (int) value;
return "small:" + narrowed;
}
return "wide:" + value;
}Pengecoran (cast) kini dilindungi oleh invarian yang terlihat. Sebuah pola bukanlah pengganti untuk bukti tersebut.
3. Pisahkan null dari pencocokan primitif
Nilai primitif tidak bisa berupa null, tetapi selektor yang dibox bisa. Switch pada selektor referensi tidak secara otomatis menjadikan null sebagai kasus numerik. Tambahkan case null jika domain memerlukan hasil total, atau tolak sebelum switch. Jangan gunakan cabang default untuk menyembunyikan null yang tidak terduga atau wrapper yang tidak dikenal; kasus-kasus tersebut memerlukan respons operasional yang berbeda.
Untuk nilai floating-point, mencocokkan tipe double tidak berarti nilainya berhingga (finite). Pertahankan pemeriksaan eksplisit untuk NaN, tak hingga positif, dan tak hingga negatif jika kode downstream mengasumsikan pengurutan atau operasi aritmatika.
4. Bangun total switch secara sengaja
Pola primitif dan konstanta dapat membuat switch lebih ringkas, tetapi cakupan tetap bergantung pada domain selektor dan guard. Kasus dengan guard tidak mencakup setiap nilai dari tipenya. Gunakan kasus tanpa guard atau default untuk sisanya, dan sertakan case null untuk selektor yang dapat bernilai null. Jika switch mengembalikan nilai yang digunakan untuk penagihan, penguraian (parsing), atau kebijakan keamanan, buat fallback dapat dipantau alih-alih menerimanya secara diam-diam.
5. Periksa batasan pratinjau
JEP 507 adalah fitur pratinjau di Java 25. Kompilasi dan eksekusi memerlukan opsi --enable-preview yang sesuai, dan rilis source/target harus cocok dengan JDK yang dipilih. Sintaks pratinjau dapat berubah atau dihapus pada rilis berikutnya. CI juga harus mengompilasi fallback yang stabil, dan artefak harus mencatat JDK, flag pratinjau, serta level bahasa. Library harus menghindari keharusan bagi konsumen untuk mengaktifkan pratinjau hanya untuk memanggil API publik.
6. Bandingkan alternatif
Gunakan pola wrapper eksplisit ketika input adalah Number yang heterogen dan kompatibilitas menjadi hal penting. Gunakan switch primitif ketika selektor sudah berupa primitif dan deployment dapat mengunci toolchain pratinjau. Gunakan konversi yang divalidasi ketika aturan bisnisnya adalah “sesuai dalam 32 bit,” karena pemeriksaan rentang mengomunikasikan maksud dan tetap bertahan jika ada perubahan sintaksis. Kode sumber yang lebih pendek bukanlah bukti dari kontrak numerik yang lebih aman.
Contoh jawaban berkualitas tinggi
“Pertama-tama saya akan menyatakan selektor dan kebijakan null. Java 25 JEP 507 adalah fitur pratinjau, jadi saya tidak akan menyajikannya sebagai sintaksis yang stabil. Pola primitif memungkinkan pencocokan yang lebih aman dan seragam di seluruh instanceof, switch, dan pola record, tetapi tidak membuat narrowing menjadi tanpa kehilangan data (lossless). Memperluas int ke long mempertahankan nilai; mengonversi long ke int memerlukan bukti rentang yang eksplisit. Untuk input yang dibox, saya menangani null, membedakan tipe wrapper, dan secara terpisah mengklasifikasikan NaN serta tak hingga. Setiap switch memiliki penanganan sisa yang disengaja, dan kasus ber-guard tidak memberikan cakupan total. Jika produksi tidak dapat mengunci Java 25 dengan pratinjau diaktifkan, saya mempertahankan pola wrapper atau pemeriksaan eksplisit dan mengompilasi kedua jalur di CI. Pengujian mencakup null, setiap batas numerik, representasi duplikat, NaN, tak hingga, dan build non-pratinjau.”
Kesalahan umum
- Menyebut sintaks pratinjau stabil → JDK berikutnya dapat mengubah atau menghapusnya → kunci versi JDK dan pertahankan fallback.
- Mengasumsikan setiap konversi numerik aman → narrowing dapat kehilangan bit atau menolak nilai → nyatakan konversi dan buktikan rentangnya.
- Membiarkan
defaultmenyerap null → null dan tipe yang tidak dikenal memerlukan penanganan yang berbeda → tambahkancase nullatau tolak sebelum pencocokan. - Memperlakukan kecocokan
doublesebagai nilai berhingga →NaNdan tak hingga tetap memenuhi tipe primitif → uji dan klasifikasikan secara eksplisit. - Menggunakan kasus ber-guard sebagai kasus yang lengkap (exhaustive) → nilai yang gagal pada guard tetap tidak cocok → tambahkan sisa tanpa guard dan uji cakupannya.
Pertanyaan lanjutan dan tanggapan
Bisakah pola long mengikat (bind) selektor int dengan aman?
Ya, widening mempertahankan nilai int. Arah sebaliknya umumnya tidak aman karena long dapat melebihi rentang int. Jika domain menjamin suatu batas, buat pemeriksaan secara eksplisit dan uji kedua batas ekstremnya.
Mengapa tidak melakukan boxing pada setiap nilai saja?
Boxing dapat mempermudah inspeksi input yang heterogen, tetapi menambah alokasi memori dan semantik wrapper, serta tidak membuktikan bahwa konversi mempertahankan nilai. Pilih opsi ini demi kompatibilitas API, bukan sebagai cara untuk menghindari penalaran numerik.
Bagaimana Anda akan menguji implementasi pratinjau?
Jalankan kasus pengujian yang sama terhadap implementasi pratinjau dan fallback yang stabil: null, nol, nilai minimum dan maksimum, nilai yang meleset satu angka di luar rentang, NaN, kedua nilai tak hingga, wrapper tak dikenal, kondisi meleset pada kasus ber-guard, dan input yang malformed. Kompilasi dengan opsi release dan flag preview yang tepat di CI, lalu jalankan tugas kompatibilitas non-pratinjau.
Bagaimana jika Java 26 mengubah aturan pratinjau?
Perlakukan level bahasa sebagai bagian dari kontrak artefak. Baca catatan rilis baru, kompilasi branch kandidat, bandingkan semantik dengan pengujian fallback, dan promosikan hanya setelah matriks kode sumber dan runtime berhasil lolos. Jangan mengaktifkan flag pratinjau baru secara diam-diam di produksi.