Java 14 Yenilikleri (2020)
Java 14, önceki sürümlerin önizleme özelliklerini olgunlaştırdı ve hata ayıklamayı kökten kolaylaştıran bir yenilik getirdi. Öne çıkanlar: switch ifadelerinin standartlaşması, pattern matching for instanceof (önizleme…
Java 14 Yenilikleri (2020)
Java 14, önceki sürümlerin önizleme özelliklerini olgunlaştırdı ve hata ayıklamayı kökten kolaylaştıran bir yenilik getirdi. Öne çıkanlar: switch ifadelerinin standartlaşması, pattern matching for instanceof (önizleme) ve yardımcı NullPointerException mesajları. Ayrıca records bu sürümde önizleme olarak geldi.
switch ifadeleri artık standart
Java 12-13'te önizleme olan switch ifadeleri, Java 14'te standart oldu. Artık güvenle kullanılır:
String aciklama = switch (sekil) { case Daire d -> "Daire"; case Kare k -> "Kare"; case Dikdortgen dk -> "Dikdörtgen"; }; // eksiksizlik (exhaustiveness) derleyici tarafından denetlenir
pattern matching for instanceof
Klasik kalıp can sıkıcıydı: önce instanceof ile kontrol, sonra ayrı bir cast. Java 14 (önizleme;
16'da standart) bunu tek adıma indirdi:
// Eski if (o instanceof String) { String s = (String) o; ... } // Yeni if (o instanceof String s) { ... } // kontrol + cast + bağlama if (o instanceof Double d && d > 3) { ... } // ek koşulla birlikte
Değişken (s, d) yalnızca koşul doğruyken ve uygun kapsamda tanımlıdır. Örnek 1
(./Ornek1.java) hem standart switch ifadesini (sealed tiplerle) hem pattern matching instanceof'u
gösterir.
Yardımcı NullPointerException mesajları
Belki de günlük hata ayıklamayı en çok kolaylaştıran yenilik. Eskiden bir NPE yalnızca
NullPointerException (mesajsız) derdi; hangi ifadenin null olduğunu sen tahmin ederdin. Java
14+ (JDK 15'ten itibaren varsayılan açık) mesajı tam olarak söyler:
Cannot invoke "Adres.sehir()" because the return value of "Kisi.adres()" is null
Özellikle zincirleme çağrılarda (a.b().c().d()) hangi halkanın koptuğunu anında gösterir. Örnek
2 (./Ornek2.java) hem nesne zinciri hem dizi erişimi için bu mesajları üretir.
records (önizleme)
Java 14, değişmez veri sınıfları için record'u önizleme olarak getirdi (16'da standart).
Bunu kendi başına bir konuda (records, Java 16 yenilikleri) ele alıyoruz.
Özet
Java 14'ün öne çıkan yeniliklerini öğrendik: standartlaşan switch ifadeleri ve pattern matching for instanceof (Örnek 1) ile hata ayıklamayı hızlandıran yardımcı NPE mesajları (Örnek 2). Sırada, text blocks'un standartlaştığı ve sealed sınıfların geldiği sürüm: Java 15.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Java 14 — switch ifadeleri STANDART + pattern matching for instanceof.
2// Çalıştırma: java Ornek1.java
3public class Ornek1 {
4
5 sealed interface Sekil permits Daire, Kare, Dikdortgen {}
6 record Daire(double r) implements Sekil {}
7 record Kare(double k) implements Sekil {}
8 record Dikdortgen(double en, double boy) implements Sekil {}
9
10 public static void main(String[] args) {
11 Sekil[] sekiller = { new Daire(2), new Kare(3), new Dikdortgen(2, 5) };
12
13 for (Sekil s : sekiller) {
14 // switch expression (Java 14'te standart) — değer döndürür, eksiksizlik denetli.
15 String aciklama = switch (s) {
16 case Daire d -> "Daire, alan=" + String.format("%.2f", Math.PI * d.r() * d.r());
17 case Kare k -> "Kare, alan=" + (k.k() * k.k());
18 case Dikdortgen dk -> "Dikdörtgen, alan=" + (dk.en() * dk.boy());
19 };
20 System.out.println(aciklama);
21 }
22
23 // pattern matching for instanceof (Java 14 önizleme, 16 standart):
24 // 'instanceof Tip degisken' -> kontrol + cast + bağlama tek adımda.
25 Object[] nesneler = { "merhaba", 42, 3.14, java.util.List.of(1, 2) };
26 for (Object o : nesneler) {
27 String bilgi;
28 if (o instanceof String str) {
29 bilgi = "String, uzunluk " + str.length(); // str otomatik String
30 } else if (o instanceof Integer i) {
31 bilgi = "Integer, karesi " + (i * i); // i otomatik Integer
32 } else if (o instanceof Double dbl && dbl > 3) { // ek koşul birlikte
33 bilgi = "Double (>3): " + dbl;
34 } else {
35 bilgi = o.getClass().getSimpleName();
36 }
37 System.out.println(o + " -> " + bilgi);
38 }
39
40 System.out.println("""
41
42 --- Java 14: switch ifadeleri standart + pattern matching instanceof ---
43 switch expression artık STANDART (önizleme değil): 'case X -> deger', eksiksizlik denetimi.
44 pattern matching instanceof: 'if (o instanceof String s)' -> kontrol+cast+bağlama tek adımda.
45 Ekstra koşulla birleşir: 'o instanceof Double d && d > 3'. Eski 'instanceof + cast' kalıbını siler.""");
46 }
47}Ornek2
çalıştırılabilir1// Ornek2: Java 14 — Helpful NullPointerExceptions (yardımcı NPE mesajları).
2// Çalıştırma: java Ornek2.java
3public class Ornek2 {
4
5 record Adres(String sehir, String ilce) {}
6 record Kisi(String ad, Adres adres) {}
7
8 public static void main(String[] args) {
9 Kisi kisi = new Kisi("Ada", null); // adres BİLEREK null
10
11 // Java 14 öncesi NPE mesajı sadece "null" derdi; HANGİ ifadenin null olduğunu söylemezdi.
12 // Java 14+: mesaj tam olarak hangi parçanın null olduğunu açıklar.
13 try {
14 int uzunluk = kisi.adres().sehir().length(); // adres() null -> .sehir() patlar
15 System.out.println(uzunluk);
16 } catch (NullPointerException e) {
17 System.out.println("Yakalanan NPE mesajı:");
18 System.out.println(" " + e.getMessage());
19 }
20
21 // Dizi/zincir örneği:
22 String[] dizi = new String[3]; // hepsi null
23 try {
24 int n = dizi[1].length(); // dizi[1] null
25 System.out.println(n);
26 } catch (NullPointerException e) {
27 System.out.println("\nDizi NPE mesajı:");
28 System.out.println(" " + e.getMessage());
29 }
30
31 System.out.println("""
32
33 --- Java 14: Helpful NullPointerExceptions ---
34 Java 14'ten itibaren NPE mesajı, TAM OLARAK hangi ifadenin null olduğunu söyler:
35 "Cannot invoke \\"...sehir()\\" because the return value of \\"...adres()\\" is null"
36 Eskiden sadece 'NullPointerException' (mesajsız) görür, satırı tahmin etmeye çalışırdın.
37 Bu özellik JDK 15'ten itibaren varsayılan açıktır; hata ayıklamayı çok hızlandırır.""");
38 }
39}