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
| Ö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 ö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:
- JEP 436 — Virtual Threads (2. Preview) — Project Loom olgunlaşıyor.
- JEP 429 — Scoped Values (1. Incubator) —
ThreadLocal'a modern, değişmez alternatif. - JEP 432 — Record Patterns (2. Preview).
- JEP 433 — Pattern Matching for switch (4. Preview).
- JEP 434 — Foreign Function & Memory API (2. Preview).
- JEP 437 — Structured Concurrency (2. Incubator).
- 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:
InheritableThreadLocalile alt thread'lere kopyalanması pahalı. - Virtual thread'lerle uyumsuz: Milyonlarca virtual thread varken her birinde
ThreadLocaltutmak ö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
- incubator turu.
StructuredTaskScopeAPI'si rafine edildi. Kalıcı yolculuk Java 21'de preview ile devam etti.
6. Foreign Function & Memory API (JEP 434) — 2. PREVIEW
- 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?
| Konu | Etki | Aksiyon |
|---|---|---|
| Virtual Threads | 2. preview, API olgunlaştı | Java 21 öncesi son testler için ideal |
| Record Patterns | 2. preview | Sözdizimi neredeyse kesinleşti |
| Pattern Matching switch | 4. (son) preview | Java 21'de kalıcı olacak |
| Scoped Values | Yeni (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ılabilir1import 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}