Eğitim Portalı/Sürüm Analizi/Java 20 (Mart 2023)
Sürüm Analizi05-java-versiyon-analizi/13-Java-20

Java 20 (Mart 2023)

| Özellik | Değer | |---|---| | Sürüm | Java 20 (JDK 20) | | Çıkış Tarihi | 21 Mart 2023 | | Destek Türü | Feature Release (kısa vadeli, LTS DEĞİL) | | LTS mı? | Hayır. Bir sonraki sürüm olan Java 21 LTS'in hemen önce…

Java 20 (Mart 2023)

Sürüm Bilgileri

ÖzellikDeğer
SürümJava 20 (JDK 20)
Çıkış Tarihi21 Mart 2023
Destek TürüFeature Release (kısa vadeli, LTS DEĞİL)
LTS mı?Hayır. Bir sonraki sürüm olan Java 21 LTS'in hemen öncesidir.
RolüJava 21 LTS'e giden son "cilalama" sürümü — özellikler son preview turlarındadır

Java 20'nin Rolü: Java 20, neredeyse tamamen Java 21 LTS'in provası gibidir. İçindeki özelliklerin hiçbiri kalıcı değildir; ancak hepsi son preview/incubator turundadır ve 6 ay sonra Java 21'de kalıcı (veya bir sonraki preview) hale gelecektir. Bu sürümün asıl değeri, ekiplerin Java 21 öncesinde API'leri son haline çok yakın halleriyle test edebilmesidir.


Genel Bakış

Java 20'deki tüm öne çıkan özellikler "evrim halindeki" özelliklerdir:

  1. JEP 436 — Virtual Threads (2. Preview) — Project Loom olgunlaşıyor.
  2. JEP 429 — Scoped Values (1. Incubator) — ThreadLocal'a modern, değişmez alternatif.
  3. JEP 432 — Record Patterns (2. Preview).
  4. JEP 433 — Pattern Matching for switch (4. Preview).
  5. JEP 434 — Foreign Function & Memory API (2. Preview).
  6. JEP 437 — Structured Concurrency (2. Incubator).
  7. JEP 438 — Vector API (5. Incubator).

Özellik Detayları

1. Scoped Values (JEP 429) — 1. INCUBATOR

Detaylı doküman: ScopedValuesNotlari.md

NEDİR?

ThreadLocal'ın modern, değişmez (immutable) ve virtual thread dostu halefi. Bir değeri, dinamik bir kapsam (scope) boyunca, açıkça parametre olarak geçirmeden alt çağrılara güvenli biçimde paylaştırmanın yolu.

NEDEN GELDİ?

ThreadLocal'ın bilinen sorunları:

  • Değiştirilebilir (mutable): Kim, ne zaman değiştirdi belli olmaz.
  • Sızıntı riski: remove() çağrılmazsa bellek sızıntısı; thread havuzlarında eski değerler kalır.
  • Kalıtım maliyeti: InheritableThreadLocal ile alt thread'lere kopyalanması pahalı.
  • Virtual thread'lerle uyumsuz: Milyonlarca virtual thread varken her birinde ThreadLocal tutmak ölçeklenmez.

Scoped Values; değişmez, sınırlandırılmış ömürlü (scoped) ve virtual thread'lerle ucuza çalışan bir alternatiftir.

ESKİ vs YENİ

// ESKİ — ThreadLocal (mutable, remove unutulursa sızar)
static final ThreadLocal<Kullanici> AKTIF = new ThreadLocal<>();
AKTIF.set(kullanici);
try { isYap(); } finally { AKTIF.remove(); } // remove unutmak yaygın hata

// YENİ (incubator/preview) — ScopedValue (immutable, otomatik kapsam)
static final ScopedValue<Kullanici> AKTIF = ScopedValue.newInstance();
ScopedValue.where(AKTIF, kullanici).run(() -> isYap());
// kapsam bittiğinde değer otomatik kalkar, sızıntı yok

EVRİM

  • Java 20: 1. incubator (JEP 429)
  • Java 21: 1. preview (JEP 446)
  • Java 22+: olgunlaşmaya devam

2. Record Patterns (JEP 432) — 2. PREVIEW

İlgili dosya: RecordPatternsGelismis.java

NEDİR?

Java 19'da gelen record yıkımının (destructuring) 2. preview'i. Bu turda var ile tür çıkarımı, generic record desteği ve for döngülerindeki kullanım gibi konular netleşti.

EVRİM

  • Java 19: 1. preview
  • Java 20: 2. preview (JEP 432)
  • Java 21: KALICI (JEP 440)

ESKİ vs YENİ (switch ile birlikte)

sealed interface Sekil permits Daire, Dikdortgen {}
record Daire(double r) implements Sekil {}
record Dikdortgen(double en, double boy) implements Sekil {}

// YENİ (preview) — switch + record pattern yıkımı
double alan = switch (sekil) {
    case Daire(double r)            -> Math.PI * r * r;
    case Dikdortgen(double e, double b) -> e * b;
};

Java 21'deki iç içe ve kalıcı örnek: 14-Java-21/RecordPatternsKalici.java


3. Virtual Threads (JEP 436) — 2. PREVIEW

NEDİR?

Java 19'daki 1. preview'in devamı. Bu turda küçük API ayarlamaları yapıldı (örn. Thread.Builder). Konsept aynıdır: hafif, JVM yönetimli, milyonlarca olabilen thread'ler.

Derinlemesine anlatım ve kalıcı örnek: 14-Java-21/VirtualThreadsKalici.java

EVRİM

  • Java 19: 1. preview
  • Java 20: 2. preview
  • Java 21: KALICI (JEP 444)

4. Pattern Matching for switch (JEP 433) — 4. PREVIEW

Dördüncü ve son preview turu. Bu turda tamlık (exhaustiveness) kuralları ve desen sözdizimi son haline geldi. Kalıcı hali Java 21 (JEP 441).

5. Structured Concurrency (JEP 437) — 2. INCUBATOR

  1. incubator turu. StructuredTaskScope API'si rafine edildi. Kalıcı yolculuk Java 21'de preview ile devam etti.

6. Foreign Function & Memory API (JEP 434) — 2. PREVIEW

  1. preview. Kalıcı hali Java 22.

7. Vector API (JEP 438) — 5. INCUBATOR

Beşinci incubator turu; SIMD hızlandırma.


Geçiş Rehberi: Java 19 -> Java 20'de Ne Değişti?

KonuEtkiAksiyon
Virtual Threads2. preview, API olgunlaştıJava 21 öncesi son testler için ideal
Record Patterns2. previewSözdizimi neredeyse kesinleşti
Pattern Matching switch4. (son) previewJava 21'de kalıcı olacak
Scoped ValuesYeni (incubator)ThreadLocal'dan geçişi planlayın

Genel Tavsiye

Java 20, doğrudan Java 21 LTS'e geçişin son provası olarak görülmelidir. Bu sürümde test edilen tüm preview API'ler, Java 21'de ya kalıcı olmuştur ya da son haline çok yaklaşmıştır. Üretim hedefiniz Java 20 değil, Java 21 LTS olmalıdır.

Kod Örnekleri(1)

RecordPatternsGelismis

çalıştırılabilir
RecordPatternsGelismis.java
1import java.util.List;
2
3/**
4 * JAVA 20 - RECORD PATTERNS (JEP 432) - 2. PREVIEW (Gelismis)
5 * ===========================================================
6 *
7 * Bu dosya, Record Patterns'in Java 20'deki 2. preview halini, switch ile
8 * birlikte ve ic ice (nested) yikim ornekleriyle gosterir.
9 *
10 * EVRIM:
11 *   Java 19: 1. preview  ->  Java 20: 2. preview  ->  Java 21: KALICI
12 *
13 * BU TURDA NETLESENLER:
14 *   - switch + record pattern kombinasyonu
15 *   - ic ice yikim (nested destructuring)
16 *   - generic record'larda tur cikarimi
17 *   - 'var' ile alan turlerini cikarim
18 *
19 * --- DERLEME / CALISTIRMA (Java 20'de PREVIEW) ---
20 *   javac --release 20 --enable-preview RecordPatternsGelismis.java
21 *   java  --enable-preview RecordPatternsGelismis
22 *
23 *   NOT: Java 21'de bu ozellik KALICI oldu; orada --enable-preview gerekmez.
24 */
25public class RecordPatternsGelismis {
26
27    // sealed (muhurlu) hiyerarsi: switch tamligi (exhaustiveness) icin ideal
28    sealed interface Sekil permits Daire, Dikdortgen, UcgenGrup {}
29    record Daire(double yaricap) implements Sekil {}
30    record Dikdortgen(double en, double boy) implements Sekil {}
31
32    // Ic ice record: bir sekil baska sekiller icerir
33    record Nokta(double x, double y) {}
34    record UcgenGrup(Nokta a, Nokta b, Nokta c) implements Sekil {}
35
36    public static void main(String[] args) {
37        System.out.println("=== JAVA 20: RECORD PATTERNS (2. PREVIEW) ===\n");
38
39        List<Sekil> sekiller = List.of(
40                new Daire(5),
41                new Dikdortgen(4, 6),
42                new UcgenGrup(new Nokta(0, 0), new Nokta(4, 0), new Nokta(0, 3))
43        );
44
45        for (Sekil s : sekiller) {
46            System.out.printf("%-40s alan = %.2f%n", s, alanHesapla(s));
47        }
48
49        System.out.println();
50        icIceYikimOrnegi();
51    }
52
53    /**
54     * switch + record pattern: tur eslesmesi ve alan cikarimi tek adimda.
55     * sealed arayuz oldugu icin 'default'a gerek yok (tamlik garantili).
56     */
57    static double alanHesapla(Sekil s) {
58        return switch (s) {
59            // Daire'nin yaricapini dogrudan yikiyoruz
60            case Daire(double r) -> Math.PI * r * r;
61
62            // Dikdortgenin iki kenarini dogrudan yikiyoruz
63            case Dikdortgen(double en, double boy) -> en * boy;
64
65            // IC ICE YIKIM: UcgenGrup icindeki uc Nokta'nin alanlarini ayni anda
66            case UcgenGrup(Nokta(var x1, var y1),
67                           Nokta(var x2, var y2),
68                           Nokta(var x3, var y3)) ->
69                    Math.abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0);
70        };
71    }
72
73    /** Tekil bir ic ice yikim ornegi (instanceof ile). */
74    static void icIceYikimOrnegi() {
75        System.out.println("--- Ic ice yikim (instanceof) ---");
76        Object nesne = new UcgenGrup(new Nokta(1, 1), new Nokta(2, 2), new Nokta(3, 1));
77
78        if (nesne instanceof UcgenGrup(Nokta(var ax, var ay), Nokta b, Nokta c)) {
79            // 'a' tamamen yikildi (ax, ay), 'b' ve 'c' butun olarak baglandi
80            System.out.println("  Ilk kose: (" + ax + ", " + ay + ")");
81            System.out.println("  Ikinci kose: " + b);
82            System.out.println("  Ucuncu kose: " + c);
83        }
84    }
85}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.