Ringkasan eksekutif

Saya membaca pengumuman bahwa JEP 401 akan membawa value classes ke JDK 28 sebagai fitur pratinjau. Matter for engineers here is the compatibility risk: enabling previews changes the behavior of 30 JDK classes even for code compiled earlier, so projects should test both disabled and enabled preview modes.

Masalah yang diselesaikan

Quality Outreach OpenJDK ingin proyek FOSS ikut menguji build JDK 28 untuk meningkatkan kualitas rilis. Program ini mencakup pengujian dengan preview features nonaktif—default JDK—and dengan preview features aktif, karena perbedaan perilaku cukup besar dan belum充分[@] covered by routine testing.

Perubahan ini penting karena proyek yang tidak mengubah source code pun dapat mengalami perbedaan semantik. JDK 28 harus tetap behave as-is when previews are disabled, but the depth of the changes still creates a possibility of unintended regressions even in that mode.

Fitur utama dan contoh kode

Saat preview diaktifkan, 30 kelas JDK menjadi value classes. Daftar itu mencakup primitive wrappers seperti Integer, Long, Double, dan Boolean; Optional serta varian primitive-nya; banyak kelas java.time; dan kelas tanggal dalam java.time.chrono.

Value class tidak memiliki object identity. == membandingkan nilai field, sehingga dua instance dengan nilai yang sama dapat dianggap identik:

var x = LocalDate.of(2026, 7, 31);
var y = LocalDate.of(2026, 7, 31);

var identical = x == y;
// false tanpa value classes
// true dengan value classes

Konsekuensi identity-sensitive operations juga berubah:

  • == dapat menghasilkan true pada kondisi yang sebelumnya menghasilkan false.
  • Value object tidak memiliki object monitor. Sinkronisasi pada objek tersebut menjadi compile error atau memicu IdentityException; wait dan notify juga tidak didukung.
  • API java.lang.ref dan java.util.WeakHashMap tidak dapat digunakan dengan value object dan akan melempar IdentityException.
  • Value object benar-benar immutable. Pemanggilan setAccessible pada field-nya menghasilkan IllegalAccessException, termasuk ketika final field mutation diaktifkan.

Perubahan konstruktor record berlaku ketika preview diaktifkan saat compilation dengan JDK 28. Record constructor secara default berjalan pada early construction, yang membatasi akses instance dan interaksi dengan this; pemanggilan instance method di dalam constructor dapat menjadi compile error baru. Compact constructor yang الصين melakukan hal tersebut perlu diubah menjadi non-compact constructor, dihapus statement-nya, atau dipindahkan setelah super()/this(...) selesai.

Contoh berikut hanya ilustrasi untuk menunjukkan kasus yang perlu diperiksa:

record Point(int x, int y) {
    Point {
        validate(x, y); // potentially invalid during early construction
    }

    static void validate(int x, int y) {
        // validation logic
    }
}

Dampak dan catatan upgrade

Saya melihat tiga kategori masalah yang perlu dipisahkan saat pengujian: expected behavioral differences between regular classes and value classes, perubahan perilaku konstruktor record, serta unexpected JDK misbehavior yang dilaporkan ke mailing list valhalla-dev.

Project sebaiknya membangun dan menguji basis kode terhadap JDK 28 dalam dua konfigurasi: preview features nonaktif dan aktif. Jika preview features diaktifkan, source code yang sebelumnya dikompilasi tanpa preview atau pada versi sebelum 28 tetap dapat menggunakan JDK value classes dan mengalami perubahan perilaku tersebut.

Need to update compatibility tests around identity, synchronization, reflection, WeakHashMap, and record constructors. JDK 8 sebenarnya telah memperkenalkan konsep value-based classes, dan JDK 16 memperluas cakupannya ke primitive wrappers; perubahan JEP 401 memperjelas dan memperluas batasan value class yang sudah dikenal itu.

Untuk masalah yang tidak diharapkan, feedback dapat dikirim ke valhalla-dev dengan registrasi. Rincian tambahan tersedia di JEP 401.

---

Pertama diumumkan di Inside Java. Baca sumber aslinya untuk detail lengkap.

Baca juga