Java JDK 28’de JEP 401 ile Nesne Karşılaştırma Değişiyor
Konuya bakış InfoQ Ana Sayfası Haberler Proje Valhalla'nın İlk Önizlemesi: JEP 401, Java Nesneleri için == Yeniden Tanımlıyor Java Projesi Valhalla'nın İlk Önizlemesi: JEP 401, Java Nesneleri 3 için == Yeniden Tanımlıyor dk okuma Bizi takip…


Konuya bakış
InfoQ Ana Sayfası Haberler Proje Valhalla’nın İlk Önizlemesi: JEP 401, Java Nesneleri için == Yeniden Tanımlıyor Java Projesi Valhalla’nın İlk Önizlemesi: JEP 401, Java Nesneleri 3 için == Yeniden Tanımlıyor dk okuma Bizi takip edin Bu makaleyi dinleyin – 0:00 Ses oynatılmaya hazır Tarayıcınız ses öğesini desteklemiyor. 0:00 0:00 Okuma listesi JEP 401, Değer Nesneleri (Önizleme), JDK 28’e entegre edilmiştir.
Yalnızca son alanlarla kimlikten bağımsız sınıf örnekleri sunar, ==’nin bu nesneler için nasıl davrandığını değiştirir ve daha düz, tahsis gerektirmeyen JVM temsillerinin kapısını açar. Önizleme varsayılan olarak devre dışıdır ve hem derleme hem de çalışma zamanında –enable-preview yapılmasını gerektirir.
Geliştiriciler açısından bunun doğrudan sonuçları, yeni bir değer değiştirici, daha katı yapım kuralları, senkronizasyon kısıtlamaları ve çeşitli değer tabanlı JDK sınıfları için geçiş etkileridir. Teklif, OpenJDK’nın valhalla-dev e-posta listesi üzerinde yıllarca süren tartışmalarla şekillendi. Değer değiştiriciyle bildirilen sınıf bir değer sınıfıdır; diğer her sınıf bir kimlik sınıfı olarak kalır.

Nasıl işliyor?
Örnek alanları dolaylı olarak nihaidir ve yeni örneğin gözlemlenebilmesi için her alanın atanması gerekir.
değer sınıfı Nokta { özel int x; // dolaylı olarak son özel int y; public Point(int x, int y) { this.x = x; // buna atanan her alan.y = y; // inşaat tamamlanmadan önce } public int x() { return x; } public int y() { return y; } } Kayıtlar, değer kaydı Renk(bayt kırmızı, bayt yeşil, bayt mavi) { } gibi, değiştiriciyi de alabilir. Bir değer sınıfının örnek yöntemleri senkronize edilemeyebilir.
JEP 539, JVM’de Sıkı Alan Başlatma, yapım kurallarını uygulayan bayt kodu doğrulamasını sağlar. En görünür anlamsal değişiklik ==’dir. Kimlik nesnelerinin davranışı değişmeden kalır. Değer nesneleri için, her iki işlenen de aynı alan değerlerine sahip aynı sınıfın örnekleri olduğunda başarılı olur; referans türündeki alanlar == kullanılarak yinelemeli olarak karşılaştırılır.
Pratik değerlendirme
p1 noktası = new Nokta(3, 4); p2 noktası = new Nokta(3, 4); p1 == p2’yi iddia edin; // doğru: aynı sınıf, aynı alan değerleri Nesne o1 = p1, o2 = p2; iddia o1 == o2; // true: hala Object String olarak ayırt edilemez s1 = “hamburger”; String s2 = new String(s1); s1 != s2’yi iddia edin; // true: String bir kimlik sınıfı olarak kalır Bu, equals’i terk etmeye yönelik bir davet değildir.
JEP 401, ==’yi eşittir yerine geçecek şekilde yeniden tanımlamaz; Nesneleri eşittir kullanarak karşılaştırmaya yönelik olağan tavsiye hâlâ geçerlidir çünkü bir değer nesnesinin iç durumu her zaman temsil ettiği durumla aynı değildir. Önizleme özellikleri etkinleştirildiğinde, ilkel sarmalayıcılar ve LocalDate dahil olmak üzere çeşitli değer tabanlı JDK sınıfları, değer sınıfları haline gelir.
Önizleme devre dışı bırakıldığında, derleyici kimlik nesnesi formlarını kullanmaya devam eder ve davranış JDK 27 ile uyumlu kalır. Önizleme etkinleştirmesi ile derlenen kod led de etkinken çalışmalıdır. LoadableDescriptors sınıf dosyası özniteliği yükleme sırasında JVM’ye bir sınıfın bir değer sınıfı olduğunu bildirdiğinden, taşınan sınıflar için yeniden derleme önerilir.
Nelere dikkat edilmeli
Bazı API’ler çalışmayı durdurur: Bir değer nesnesi için Referans oluşturmak, IdentityException’ı oluşturur ve javac, kimlik uyarılarını JDK 28’deki değer sınıflarına kadar genişletir. Beklenen sonuç, garantili bir kıyaslama sonucundan ziyade optimizasyondur.
Bir JVM, bir değer nesnesini kendisini oluşturan alanlara skalarize edebilir veya onu doğrudan bir alan veya dizi öğesinde depolanan kompakt bir temsil halinde düzleştirebilir. Düzleşme atomiklik nedeniyle kısıtlı kalır; Tipik platformlarda mevcut kodlama, boş işaret dahil 64 bit kadar küçük olabilir.
Her iki optimizasyon da geçerli olmadığında JVM, özellikle optimize edilmiş JIT kodu mevcut olmadan önce ısınma sırasında normal tahsise geri döner. JEP 401, sorunu geliştiricilerin kastettiği şey ile Java’nın garanti ettiği şey arasındaki uyumsuzluk olarak çerçeveliyor.
Verileri taşımak için karmaşık bir sayıyı, piksel rengini veya tarihi temsil eden küçük sınıflar mevcuttur, ancak sıradan Java nesneleri kimlikle tanımlanır: her yapıcı çağrısı, diğer tüm nesnelerden ayırt edilebilir bir şey üretir. JEP, bu tür tipler için kimliğin çoğu zaman önemsiz olduğunu ve zararlı olabileceğini savunuyor. Kimlik aynı zamanda bir çalışma zamanı maliyeti de taşır.
Genellikle JVM’nin her nesne için bellek ayırmasını ve bu konuma referans vermesini gerektirir. her kullanımda çöp toplayıcı baskısı artıyor ve yerellik bozuluyor. Kaçış analizi bu maliyetin bir kısmını karşılar, ancak optimizasyonları öngörülemez ve bir nesne kaçtığında (bir alanda veya dizide depolandığı zamanlar da dahil olmak üzere) yardımcı olmaz.
JEP, değer nesnelerinin Java’nın nesne modelinde önemli değişiklikler yaptığını kabul eder. Geliştiriciler == ve senkronizasyonun yeni davranışı karşısında şaşırabilirler, ancak teklif bu tür kesintilerin nadir ve yönetilebilir olmasını beklemektedir. if_acmpeq bayt kodu ayrıca kimlik durumunun hızlı bir yol olarak kalması amaçlanarak ek bir değer nesnesi kontrolü kazanır.
Belgede iki güvenlik hususu tanımlanmaktadır: == ve kimlikHashCode dolaylı olarak özel alan değerlerini ortaya çıkarabilir ve iki büyük değer nesnesi ağacının karşılaştırılması sınırsız zaman alabilir.
Daha fazlasını gösterDaha az konu göster İlgili Sponsorlar Stripe, Veritabanı İyileştirme Projesini Otomatikleştirmek için Grafik Arama ve Durum Makinelerini Kullanıyor Valhalla’nın İlk Önizlemesi: JEP 401, Java Nesneleri için == Yeniden Tanımlıyor Pinterest, Merkezi Bir Terraform İşlem Hattı ile AWS Altyapısını Geniş Ölçekte Nasıl Koruyor Canva, Yüz Milyonlarca Oturumda Oturum İptali için S3 Tabanlı Mimariyi Paylaşıyor Vercel Labs Zero: Grafik Öncelikli Bir Dil Sunuyor So Agents Kodu Yazın Kültür ve Yöntemler Trendler 2026: Yapay Zeka Mühendisliğinin İnsani Tarafı InfoQ’da geçen haftanın içeriğinin özeti her Salı günü gönderilir.
Bir com’a katıl 250.000’den fazla üst düzey geliştiriciden oluşan topluluk. Bir örneği görüntüle
İlgili yazılar
Editörün Notu
JEP 401 ile Java’da nesne karşılaştırma mantığı değişirken, geliştiricilerin yeni değer nesnelerini kullanarak daha performanslı ve hatasız kod yazmaları mümkün hale geliyor. Bu yenilik, özellikle büyük veri ve yüksek performans gerektiren uygulamalarda önemli avantajlar sunacak.
