Java 12 Özellikleri: Kapsamlı Bir Teknik Rehber
Java 12, Oracle tarafından 19 Mart 2019’da yayımlanan, uzun vadeli destek (LTS) olmayan bir ara sürümdür. Java’nın altı aylık sürüm döngüsü kapsamında çıkan bu sürüm, özellikle G1 Çöp Toplayıcı’daki (Garbage Collector) iyileştirmeler ve “Switch Expressions” gibi dil özelliklerinin önizlemesiyle dikkat çekmektedir. Her ne kadar LTS olmasa da, Java platformunun gelişiminde önemli adımlar atmış ve sonraki sürümlere zemin hazırlamıştır. Bu rehberde, Java 12’nin getirdiği başlıca yenilikleri, kod örnekleriyle ve pratik bilgilerle detaylı bir şekilde inceleyeceğiz.
Yeni Dil Özellikleri: Switch Expressions (Önizleme)
Java 12’nin belki de en çok konuşulan özelliği, JEP 325 ile tanıtılan “Switch Expressions”ın önizleme sürümüdür. Geleneksel switch ifadeleri, break unutulduğunda oluşabilen “fall-through” hataları, kod tekrarı ve okunabilirlik sorunları gibi bazı dezavantajlara sahipti. Switch Expressions, bu sorunları gidermeyi ve switch yapısını daha esnek ve güçlü hale getirmeyi amaçlamaktadır.
Geleneksel Switch İfadelerinin Sorunları
Aşağıdaki geleneksel switch örneğini inceleyelim:
int day = 3;
String dayType;
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
dayType = "Hafta İçi";
break;
case 6:
case 7:
dayType = "Hafta Sonu";
break;
default:
dayType = "Geçersiz Gün";
break;
}
System.out.println(dayType); // Hafta İçi
Bu örnekte, break ifadelerinin her case bloğunun sonunda kullanılması gerektiği, aksi takdirde istenmeyen davranışlara yol açabileceği görülmektedir. Ayrıca, bir değer atamak için dayType değişkeninin dışarıda tanımlanması gerekmektedir.
Switch Expressions ile Yenilikler
Switch Expressions, switch yapısının bir ifade (expression) olarak kullanılmasını sağlar, yani bir değer döndürebilir. Yeni -> (arrow) operatörü ile case etiketleri daha kısa ve okunabilir hale gelir.
int day = 3;
String dayType = switch (day) {
case 1, 2, 3, 4, 5 -> "Hafta İçi";
case 6, 7 -> "Hafta Sonu";
default -> "Geçersiz Gün";
};
System.out.println(dayType); // Hafta İçi
Bu örnekte görüldüğü gibi:
caseetiketleri virgülle ayrılarak birden fazla değeri kapsayabilir.->operatörü, ilgilicaseiçin doğrudan döndürülecek değeri veya çalıştırılacak tek bir ifadeyi belirtir.breakifadelerine gerek kalmaz, bu da fall-through hatalarını ortadan kaldırır.switchdoğrudan bir değer döndürdüğü için, bir değişkene atama işlemi çok daha temiz ve tek satırda yapılabilir.
Eğer bir case bloğu birden fazla ifade içerecekse, yield anahtar kelimesi ile bloktan değer döndürülebilir. Ancak bu özellik (yield), Java 12’de Switch Expressions’ın ilk önizleme sürümünde tam olarak yer almamış, Java 13’te daha belirgin hale gelmiştir. Java 12’de ana odak -> operatörü ve ifadenin bir değer döndürmesi üzerinedir.
Pratik Faydaları
Switch Expressions, kodun okunabilirliğini artırır, hata yapma olasılığını azaltır ve daha özlü bir kod yazımına olanak tanır. Özellikle enum’lar veya sabit değerlerle çalışırken çok kullanışlıdır. Bu özellik, Java 14 ile standart hale gelmiştir.
G1 Çöp Toplayıcı İyileştirmeleri
Java 12, G1 (Garbage-First) çöp toplayıcısının performansını ve davranışını iyileştirmeye yönelik birkaç önemli JEP içerir. G1, Java 9’dan bu yana varsayılan çöp toplayıcıdır ve özellikle büyük yığın belleklerinde (heap) düşük duraklama süreleri (pause times) sağlamayı hedefler.
JEP 344: G1 Abortable Mixed Collections (G1 İptal Edilebilir Karışık Koleksiyonlar)
G1, yığın belleğini (heap) bölgelere (regions) ayırır ve hem genç (young) hem de eski (old) nesilleri toplayan “karışık koleksiyonlar” (mixed collections) yapar. Bu koleksiyonlar bazen hedef duraklama süresini aşabilir. JEP 344, G1’in karışık koleksiyonlarını daha “iptal edilebilir” hale getirerek, bir koleksiyon döngüsünün duraklama süresi hedefine ulaşmadan önce durdurulmasına olanak tanır. Bu sayede, G1’in belirlenen duraklama süresi hedeflerine daha iyi uyması sağlanır ve uygulamanın performansı daha öngörülebilir hale gelir.
JEP 346: Promptly Return Unused Committed Memory from G1 (G1’den Kullanılmayan Tahsis Edilmiş Belleği Hızla İade Et)
Özellikle konteynerize edilmiş ortamlarda (Docker, Kubernetes vb.) çalışan uygulamalar için bellek kullanımı kritik öneme sahiptir. G1 çöp toplayıcı, geçmişte kullanılmayan heap belleğini işletim sistemine (OS) geri verme konusunda biraz yavaş davranabilirdi. JEP 346 ile G1, kullanılmayan ve taahhüt edilmiş (committed) heap belleğini işletim sistemine daha hızlı bir şekilde iade edebilir. Bu, özellikle burst yüklerle çalışan ve daha sonra bellek ihtiyacı azalan uygulamaların, sistem kaynaklarını daha verimli kullanmasına olanak tanır. Bu iyileştirme, konteyner ortamlarında çalışan Java uygulamalarının genel ayak izini (footprint) ve maliyetini düşürmeye yardımcı olur.
Deneysel Çöp Toplayıcı: Shenandoah (JEP 189)
Java 12 ile birlikte, JEP 189 kapsamında “Shenandoah” adında deneysel bir çöp toplayıcı tanıtıldı. Shenandoah, özellikle çok düşük duraklama süreleri (ultra-low pause times) sunmayı hedefleyen bir çöp toplayıcıdır. G1’in aksine, Shenandoah’ın çoğu çöp toplama işini eş zamanlı (concurrently) olarak, yani uygulama iş parçacıkları çalışırken yapmasıyla öne çıkar.
Shenandoah’ın Temel Özellikleri
- Ultra Düşük Duraklama Süreleri: Shenandoah’ın en büyük vaadi, yığın boyutu ne olursa olsun (birkaç yüz MB’den birkaç TB’ye kadar) duraklama sürelerinin milisaniyeler seviyesinde kalmasıdır. Bu, özellikle interaktif uygulamalar, finansal ticaret sistemleri veya gerçek zamanlı veri işleme gibi düşük gecikme süresi gerektiren uygulamalar için kritik bir avantajdır.
- Eş Zamanlı İşlem: Çoğu çöp toplama aşamasını uygulama iş parçacıklarıyla eş zamanlı olarak yürütür. Bu, uygulamanın çalışmaya devam etmesini ve “donma” sürelerinin minimumda tutulmasını sağlar.
Nasıl Etkinleştirilir?
Shenandoah deneysel olduğu için JVM’de açıkça etkinleştirilmesi gerekir:
java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC MyApp.java
Pratik Bilgiler ve Uyarılar
Shenandoah, Java 12’de deneysel bir özellik olarak sunuldu. Üretim ortamlarında kullanmadan önce kapsamlı testler yapılması şiddetle tavsiye edilir. Düşük duraklama süreleri sunsa da, eş zamanlı çalışması nedeniyle genel iş hacminde (throughput) hafif bir düşüşe neden olabilir. Doğru kullanım senaryosunda, Shenandoah oyun değiştirici bir özellik olabilir. Daha sonraki Java sürümlerinde (Java 15 itibarıyla) Shenandoah standart bir özellik haline gelmiştir.
Diğer Önemli Geliştirmeler
Java 12, yukarıda bahsedilenlerin dışında, platformun temelini güçlendiren ve gelecekteki geliştirmelere zemin hazırlayan başka JEP’ler de içerir.
JEP 340: One AArch64 Port (Tek Bir AArch64 Portu)
Bu JEP, mevcut arm64 portunu kaldırarak, yalnızca aarch64 portunun korunmasını sağlamıştır. Bu, ARM 64-bit mimarisi için tek ve daha sürdürülebilir bir kaynak ağacı oluşturarak geliştirme ve bakım süreçlerini basitleştirir.
JEP 341: Default CDS Archives (Varsayılan CDS Arşivleri)
Sınıf Veri Paylaşımı (Class Data Sharing – CDS), Java uygulamalarının başlangıç sürelerini hızlandırmak ve bellek ayak izini azaltmak için kullanılan bir teknolojidir. JEP 341 ile birlikte, varsayılan CDS arşivleri, JVM tarafından otomatik olarak oluşturulur ve kullanılır. Bu, kullanıcıların CDS’yi manuel olarak yapılandırmasına gerek kalmadan, bu performans iyileştirmelerinden faydalanmasını sağlar. Özellikle küçük uygulamalar veya konteynerize edilmiş ortamlarda başlatma sürelerini önemli ölçüde kısaltabilir.
JEP 334: JVM Constants API (Önizleme)
Bu JEP, anahtar sınıf dosyası ve çalışma zamanı yapıtlarına programatik erişim sağlayan bir API’nin önizlemesini sunar. Daha çok düşük seviyeli araçlar, kütüphane geliştiricileri ve JVM düzeyinde çalışanlar için faydalıdır. Bu API, ConstantPool gibi JVM’nin dahili yapılarına erişimi standartlaştırarak, Java’nın meta programlama yeteneklerini geliştirir.
Pratik Uygulamalar ve Genel Faydalar
Java 12, özellikle aşağıdaki alanlarda pratik faydalar sunar:
- Geliştirici Verimliliği: Switch Expressions, daha okunabilir, güvenli ve özlü kod yazarak geliştiricilerin verimliliğini artırır. Fall-through hatalarının ortadan kalkması, hata ayıklama süresini azaltır.
- Performans İyileştirmeleri: G1 çöp toplayıcısındaki iyileştirmeler (iptal edilebilir karışık koleksiyonlar ve bellek iadesi), uygulamaların daha öngörülebilir performans göstermesini ve sistem kaynaklarını daha verimli kullanmasını sağlar. Özellikle konteynerize ortamlarda çalışan uygulamalar için bu, maliyet ve kaynak optimizasyonu açısından önemlidir.
- Düşük Gecikme Süresi Gerektiren Uygulamalar: Deneysel Shenandoah çöp toplayıcı, kritik düşük gecikme süresi gerektiren uygulamalar için yeni bir çözüm sunar. Bu tür uygulamalar için milisaniyelerin bile önemli olduğu durumlarda Shenandoah büyük bir fark yaratabilir.
- Platform Genişletilebilirliği: JVM Constants API gibi özellikler, Java platformunun gelecekteki geliştirmelere ve araçlara daha açık olmasını sağlar.
Java 12 bir LTS sürümü olmasa da, getirdiği yenilikler Java ekosisteminin sürekli gelişimini ve modern uygulama ihtiyaçlarına adaptasyonunu gözler önüne sermektedir. Özellikle Switch Expressions gibi dil özellikleri ve GC iyileştirmeleri, sonraki LTS sürümlerinin temelini oluşturmuştur.
Sonuç ve Sıkça Sorulan Sorular
Java 12, her ne kadar kısa ömürlü bir sürüm olsa da, Java geliştirme dünyasına önemli yenilikler getirmiştir. Switch Expressions gibi dil özelliklerinin önizlemesi, G1 çöp toplayıcısındaki kritik iyileştirmeler ve deneysel Shenandoah GC’nin tanıtılması, Java’nın performans, okunabilirlik ve modern uygulama gereksinimlerine adaptasyon konusundaki kararlılığını göstermektedir. Bu yenilikler, daha sonraki sürümlerde olgunlaşarak standart hale gelmiş ve geliştiricilerin günlük iş akışlarını kolaylaştırmıştır.
Sıkça Sorulan Sorular (SSS)
Java 12 bir LTS (Uzun Vadeli Destek) sürümü müdür?
Hayır, Java 12 bir LTS sürümü değildir. Java’nın altı aylık sürüm döngüsü kapsamında çıkan, kısa ömürlü bir ara sürümdür. LTS sürümleri her iki yılda bir yayımlanır (örneğin Java 11, Java 17).
Java 12’deki en önemli yenilik nedir?
Java 12’deki en dikkat çekici ve geliştiriciler için en pratik yenilik, “Switch Expressions”ın önizleme sürümüdür. Bu özellik, switch ifadelerinin daha okunabilir, güvenli ve bir değer döndürebilen bir yapıya dönüşmesini sağlamıştır.
Shenandoah GC’yi üretim ortamlarında kullanmalı mıyım?
Java 12’de Shenandoah GC deneysel bir özellik olarak sunulmuştur. Üretim ortamlarında kullanmadan önce uygulamanızla kapsamlı testler yapmanız ve performans profilini dikkatlice değerlendirmeniz önerilir. Daha sonraki sürümlerde (Java 15’ten itibaren) Shenandoah standart bir özellik haline gelmiştir.
Neden Java 12’ye geçmeliyim (LTS olmamasına rağmen)?
Eğer en son dil özelliklerini ve performans iyileştirmelerini denemek istiyorsanız veya belirli bir JEP’in (örneğin G1 iyileştirmeleri) uygulamanız için kritik faydalar sağlayacağını düşünüyorsanız Java 12’yi değerlendirebilirsiniz. Ancak genel olarak, üretim ortamları için LTS sürümleri (Java 11, Java 17 gibi) tercih edilir. Java 12’deki çoğu özellik sonraki LTS sürümlerine dahil edilmiştir.
Switch Expressions ne zaman standart bir özellik oldu?
Switch Expressions, Java 12 ve Java 13’te önizleme özelliği olarak kaldıktan sonra, Java 14 ile standart bir dil özelliği haline gelmiştir.