Java 15 Yeni Özellikler

Java 15 Eylül 15 itibari ile yayınlandı. Genel itibari ile çok fazla teknik bir değişiklik olmasa da crypto ile uğraşan kişilerin ilgileneceği EdDSA tarafında bir gelişme bulunmakta.Eğer performansa tarafına ilgi duyuyorsanız yine ZGC ilginizi çekecek diğer bir yenilik. Eğer framework tarafında bir geliştirme yapmak istiyorsanız da gizli sınıflar ilginizi çekebilir. En önemli değişikliklerin üzerinden gidecek olursak;

  • Mühürlü Sınıflar – Sealed Classes
  • Desen eşleşmesi örneği – Pattern Matching Instanceof
  • Metin Kalıpları – Text blocks
  • Kayıtlar – Records.

Kısaca üzerinden geçecek olursak;

Mühürlü Sınıflar

Kariyerinizin bir noktasında sınıfların nereye kadar genişletilebileceğini kontrol etme ihtiyacı duymuş olabilirsiniz. Başka dillerde “sealed” olarak sınıfların izin olmadan genişletilmesini ( extends ) engelleyen modifier’lar mevcuttur. Java’da ise şimdiye kadar extends için bir kontrol bulunmuyordu. Bu konsepte alışık olmayan kişiler için genişlemeyi bir kaç belirli durum haricinde engellemek amaçlanmaktadır. Örneği şu şekilde verilebilir.

abstract sealed class Bicim {
     abstract public ciz();
 }
 final class Kare extends Bicim {
     public ciz() {
     }
 }
 final class Cember extends Bicim {
     public ciz() {
     }
 }

Bu örnekte Bicim bir abstract sınıf ( olmayabilirdi de) ve sadece iki tane bicime sahip bunlar Kare ve Cember. Burada tüm sınıflar aynı dosya içinde tanımlanmış olsa da farklı dosyalar da da olabilirlerdi. Interfaceler’de aslında mühürlenebilir. Şu şekilde;

public abstract sealed class Bicim
    permits ayri.bir.sinif.Kare,
            ayri.bir.sinif.farkli.paket.Cember {
        …
    }
}

Desen eşleşmesi örneği – Pattern matching instanceof

Zaten yıllardır instanceof ile değişkenin tipini kontrol edebiliyorduk. Aynı şekilde yıllardır da bundan sonra değişkeni kullanabilmek için cast işlemi yapıyorduk.

if( test instanceof Interface1){
((interface1)test).someMethod();
}

Bunun yerine JDK 15’de şu şekilde bir yazım geliyor.

if( test instanceof Interface1 f){
     f.someMethod();
 }else{
     f.someOtherMethod(); // compiler hatası.
 }

Metin Kalıpları – Text blocks

Metin bloklarını http://www.sahinyanlik.com.tr/2020/java-14-yeni-ozellikler/ de görebilirsiniz. Aslında JDK 14’de bu özellik ön izleme olarak çıkmıştı. Artık kullanılabileceği belirtilmekte.

Kayıtlar – Records

Records da bu versiyon ile ikinci ön izlemeye alınmıştır.

Java 14 Yeni Özellikler

Java 14 versiyonu 17 Mart’ta yayınlanacak. Peki bu versiyon içerisinde bizi ne bekliyor

  • Gelişmiş Switch ifadeleri. Bunlar aslın 12, 13’de gösterilmişti Java 14 bunu tamamen destekler hale getirildi.
  • Text blocklarının daha düzgün şekilde yazılabilmesi.
  • instanceof ile pattern matching yapabilme özelliği
  • NullPointerException’ların daha yardımcı hale getirilmesi.

Switch İfadeleri

Amaçlanan daha kolay bir yazımdı ve artık switch ifadeleri şu şekilde yazılabilir oldu:

Text blokları artık daha temiz bir şekilde yazılabilir. Aslında bu python’da vardı artık Java’ya da geldi.

Şeklinde yazılan bir String artık:

Şeklinde yazılabilir. Çoklu satır yazarken kullandığımız + işaretine de gerek kalmayacak böylece. Artık

Şeklinde yazabiliriz.

Instanceof için Pattern Matching:

Normalde yukarıdaki gibi yapılan bir kontrol artık:

Beni en heyecanlandıran yenilik ise Record yapısının gelmesi. Aslında bu da diğer dillerde çokça kullanılan bir özellik. Bu kullanım ile get,set, toString(), hashCode() ve equals() yazmaya gerek kalmayacaktır.
Şu şekilde örnek verecek olursak mesela:

şeklinde bir sınıf yazmak yerine sadece:

Yazmak yeterli olacaktır. Çok temiz entity sınıfları olacak böylece. Tabi bu entity sınıfları olacak böylece. Daha yardımcı NullPointerExceptionlar NullPointerException tüm java programcıları için baş belası. Mimariye göre objenin alt alanlarına erişim arttıkça bunun olma ihtimali de artmakta. Şu anda alınan bir problem şu şekilde gösterilmekte. Örneğin:

ile City’nin ismini alacak olalım.
Şu anda alacağımız hata:

Java 14 sonrasında ise:

Gördüğünüz gibi artık nerede NullPointerException alındığı yazıyor.