Eğitim Portalı/Java/Java 14 Yenilikleri (2020)
Java01-java/60-java14-yenilikleri

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ılabilir
Ornek1.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.