Maklum balas dan skop
Pasukan anda sedang menilai ciri pratonton Java 25 untuk corak jenis primitif dalam instanceof, switch dan corak rekod. Kod menerima nilai Number daripada penghurai (parser) dan mesti mengklasifikasikan kes integer dan titik terapung tanpa narrowing yang tidak disengajakan atau kegagalan null. Terangkan peraturan bahasa, tulis contoh kecil, dan berikan keputusan keserasian dan pelancaran.
JEP 507 ialah ciri pratonton dalam Java 25. Jawapan yang baik mesti menyatakan bahawa sintaks pratonton memerlukan bendera pengkompil dan masa jalan yang jelas dan bukannya secara automatik menjadi kontrak pengeluaran yang stabil.
Perkara yang diuji oleh penemu duga
- Sama ada anda membezakan corak rujukan daripada corak primitif dan penukaran boxing.
- Sama ada anda boleh menerangkan widening yang selamat, narrowing yang tidak selamat dan kehilangan maklumat.
- Sama ada anda mengendalikan
null,NaN, infiniti dan jenis pemilih secara jelas. - Sama ada anda memahami tingkah laku switch yang menyeluruh (exhaustive) dan sempadan keserasian pratonton.
- Sama ada anda boleh mereka bentuk ujian dan sandaran (fallback) dan bukannya menggunakan sintaks semata-mata kerana ia kelihatan lebih pendek.
Penemu duga mencari peraturan dan contoh lawan, bukan senarai nombor JEP.
Penjelasan untuk ditanya terlebih dahulu
- Adakah binaan dibenarkan menggunakan ciri pratonton dalam CI dan pengeluaran? Jika tidak, penyelesaian mesti menggunakan corak era Java 21 atau penukaran eksplisit.
- Adakah “mengelaskan nombor” mengekalkan nilai asal, atau adakah hasil integer terhad boleh diterima? Itu menentukan sama ada narrowing adalah sah.
- Patutkah
nullditolak, dipetakan keUNKNOWN, atau dikendalikan oleh cabang switch khusus? - Adakah
NaNdan infiniti merupakan input yang sah? Pemadanan jenis numerik tidak mengubahnya menjadi nilai terhingga biasa. - Adakah kod sumber yang sama mesti dikompilasi pada JDK bukan pratonton? Jika ya, asingkan kod pratonton di belakang modul atau kekalkan pelaksanaan yang stabil.
Rangka kerja jawapan 30 saat
“Pratonton JEP 507 Java 25 membolehkan corak menyebut jenis primitif dalam konteks yang sebelum ini memerlukan boxing atau pengawal (guards) yang rumit. Pengkompil membenarkan penukaran yang selamat di bawah peraturan corak dan menolak narrowing yang boleh kehilangan maklumat. Saya akan mengendalikan null sebelum pemadanan primitif, menguji nilai sempadan seperti Integer.MAX_VALUE, NaN dan infiniti, serta mengekalkan bendera pratonton dalam rantaian alat. Jika penggunaan tidak dapat menetapkan Java 25 dengan pratonton didayakan, saya akan menggunakan switch yang stabil atau penukaran yang disahkan secara eksplisit sebagai ganti.”
Penyelesaian langkah demi langkah
1. Mulakan dengan jenis statik nilai
Keserasian corak bukanlah lesen untuk menukar setiap nombor kepada setiap primitif. Rujukan Number mungkin memegang Integer, Long, Double atau pelaksanaan lain. Corak yang mula-mula mengenali pembalut rujukan dan kemudian menyahkotak (unbox) mengekalkan kontrak yang berbeza daripada corak jenis primitif ke atas pemilih primitif. Nyatakan jenis pemilih dan arah penukaran sebelum membincangkan sifat menyeluruh (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 memadankan jenis pembalut. Ia tidak mendakwa bahawa setiap Number boleh dikecilkan (narrowing) dengan selamat kepada int.
2. Terangkan widening berbanding narrowing
JEP 507 menyelaraskan corak primitif supaya corak boleh memadankan nilai primitif apabila penukaran adalah selamat untuk pembolehubah corak. Melebarkan (widening) int kepada long mengekalkan setiap nilai. Mengecilkan (narrowing) long kepada int boleh membuang bit tinggi, jadi corak yang secara senyap menerima penukaran sedemikian adalah tidak selamat. Jawapan harus menamakan penukaran yang ditolak dan mencadangkan pemeriksaan julat eksplisit jika narrowing merupakan keperluan perniagaan.
static String bucket(long value) {
if (value >= Integer.MIN_VALUE && value <= Integer.MAX_VALUE) {
int narrowed = (int) value;
return "small:" + narrowed;
}
return "wide:" + value;
}Penukaran jenis (cast) kini dilindungi oleh invarian yang jelas. Corak bukanlah pengganti bagi bukti tersebut.
3. Asingkan null daripada pemadanan primitif
Nilai primitif tidak boleh menjadi null, tetapi pemilih berkotak (boxed) boleh. Switch ke atas pemilih rujukan tidak secara senyap menjadikan null sebagai kes numerik. Tambah case null apabila domain memerlukan hasil menyeluruh, atau tolaknya sebelum switch. Jangan gunakan cabang default untuk menyembunyikan null yang tidak dijangka atau pembalut yang tidak diketahui; kes-kes tersebut mempunyai tindak balas operasi yang berbeza.
Untuk nilai titik terapung, pemadanan jenis double tidak bermakna nilai tersebut adalah terhingga. Kekalkan semakan eksplisit untuk NaN, infiniti positif dan infiniti negatif apabila kod hiliran menganggap susunan atau aritmetik.
4. Bina switch menyeluruh dengan sengaja
Corak primitif dan pemalar boleh menjadikan switch ringkas, tetapi liputan masih bergantung pada domain pemilih dan pengawal. Kes yang dikawal (guarded case) tidak meliputi setiap nilai jenisnya. Gunakan kes tanpa kawalan atau default untuk baki, dan sertakan case null untuk pemilih yang boleh bernilai null. Jika switch mengembalikan nilai yang digunakan untuk pengebilan, penghuraian atau dasar keselamatan, jadikan sandaran dapat diperhatikan dan bukannya menerimanya secara senyap.
5. Semak sempadan pratonton
JEP 507 adalah pratonton dalam Java 25. Pengkompilasian dan pelaksanaan memerlukan pilihan --enable-preview yang sepadan, dan keluaran source/target mesti sepadan dengan JDK yang dipilih. Sintaks pratonton boleh berubah atau hilang dalam keluaran kemudian. CI juga harus mengkompilasi sandaran yang stabil, dan artifak harus merekodkan JDK, bendera pratonton dan tahap bahasa. Pustaka harus mengelak daripada memaksa pengguna mendayakan pratonton semata-mata untuk memanggil API awam.
6. Bandingkan alternatif
Gunakan corak pembalut eksplisit apabila input ialah Number yang heterogen dan keserasian adalah penting. Gunakan switch primitif apabila pemilih sudah menjadi primitif dan persekitaran pelaksanaan boleh menetapkan rantaian alat pratonton. Gunakan penukaran yang disahkan apabila peraturan perniagaan ialah "muat dalam 32 bit", kerana semakan julat menyampaikan niat dan kekal walaupun sintaks berubah. Kod sumber yang lebih pendek bukanlah bukti kontrak numerik yang lebih selamat.
Contoh jawapan berkualiti tinggi
“Mula-mula saya akan menyatakan pemilih dan dasar null. Java 25 JEP 507 ialah ciri pratonton, jadi saya tidak akan membentangkannya sebagai sintaks yang stabil. Corak primitif membolehkan pemadanan yang lebih selamat dan lebih seragam merentas instanceof, switch dan corak rekod, tetapi ia tidak menjadikan narrowing tanpa kehilangan maklumat. Melebarkan int kepada long mengekalkan nilai; menukar long kepada int memerlukan bukti julat yang eksplisit. Untuk input berkotak, saya mengendalikan null, membezakan jenis pembalut, dan secara berasingan mengelaskan NaN serta infiniti. Setiap switch mempunyai baki yang disengajakan, dan kes yang dikawal tidak menyediakan liputan menyeluruh. Jika pengeluaran tidak dapat menetapkan Java 25 dengan pratonton didayakan, saya mengekalkan corak pembalut atau semakan eksplisit dan mengkompilasi kedua-dua laluan dalam CI. Ujian termasuk null, setiap sempadan numerik, perwakilan pendua, NaN, infiniti dan binaan bukan pratonton.”
Kesilapan biasa
- Menyatakan sintaks pratonton sebagai stabil → JDK yang lebih baharu boleh mengubah atau mengalih keluarnya → tetapkan versi JDK dan kekalkan sandaran.
- Menganggap setiap penukaran numerik adalah selamat → narrowing boleh kehilangan bit atau menolak nilai → nyatakan penukaran dan buktikan julatnya.
- Membiarkan
defaultmenyerap null → null dan jenis yang tidak diketahui memerlukan pengendalian yang berbeza → tambahcase nullatau tolak sebelum pemadanan. - Menganggap padanan
doublesebagai terhingga →NaNdan infiniti masih memenuhi jenis primitif → uji dan kelaskannya secara eksplisit. - Menggunakan kes yang dikawal sebagai menyeluruh → nilai yang gagal melepasi pengawal kekal tidak dipadankan → tambah baki tanpa kawalan dan uji liputan.
Soalan susulan dan jawapan
Bolehkah corak long mengikat pemilih int dengan selamat?
Ya, widening mengekalkan nilai int. Arah sebaliknya secara amnya tidak selamat kerana long mungkin melebihi julat int. Jika domain menjamin sempadan, kodkan semakan secara eksplisit dan uji kedua-dua bahagian hujung.
Mengapa tidak meletakkan boxing pada setiap nilai sahaja?
Boxing boleh memudahkan pemeriksaan input yang heterogen, tetapi ia menambah peruntukan dan semantik pembalut serta tidak membuktikan bahawa penukaran mengekalkan nilai. Pilihnya untuk keserasian API, bukan sebagai cara untuk mengelakkan penaakulan numerik.
Bagaimanakah anda akan menguji pelaksanaan pratonton?
Jalankan kes yang sama terhadap pelaksanaan pratonton dan sandaran yang stabil: null, sifar, nilai minimum dan maksimum, nilai di luar julat sebanyak satu, NaN, kedua-dua infiniti, pembalut yang tidak diketahui, kegagalan kes yang dikawal dan input yang tidak sah. Kompilasi dengan bendera release dan preview yang tepat dalam CI, kemudian jalankan kerja keserasian bukan pratonton.
Bagaimana jika Java 26 mengubah peraturan pratonton?
Anggap tahap bahasa sebagai sebahagian daripada kontrak artifak. Baca nota keluaran baharu, kompilasi cawangan calon, bandingkan semantik dengan ujian sandaran, dan promosikan hanya selepas matriks kod sumber dan masa jalan lulus. Jangan dayakan bendera pratonton baharu secara senyap dalam pengeluaran.