Java 19 Yenilikleri (2022)
Java 19, LTS olmayan bir sürüm olsa da, Java'nın geleceğini şekillendiren iki büyük özelliğin önizleme olarak ilk kez göründüğü sürümdür: Sanal Thread'ler (Project Loom) ve Record Patterns. Bu özellikler Java 21'de st…
Java 19 Yenilikleri (2022)
Java 19, LTS olmayan bir sürüm olsa da, Java'nın geleceğini şekillendiren iki büyük özelliğin önizleme olarak ilk kez göründüğü sürümdür: Sanal Thread'ler (Project Loom) ve Record Patterns. Bu özellikler Java 21'de standartlaştı; ama köklerini burada görmek, onların neden geliştirildiğini anlamanı sağlar. (Örnekler JDK 21'in standart API'siyle çalışır.)
Sanal Thread'ler (önizleme)
Geleneksel platform thread'leri, işletim sistemi thread'lerine birebir karşılık gelir; pahalıdır (her biri megabaytlarca yığın), bu yüzden ancak birkaç bin tane oluşturabilirsin. Sanal thread'ler ise JVM tarafından yönetilen, çok hafif thread'lerdir — milyonlarcası ucuza oluşturulabilir:
try (var exec = Executors.newVirtualThreadPerTaskExecutor()) { for (int i = 0; i < 10_000; i++) exec.submit(() -> { /* G/Ç işi */ }); } Thread.ofVirtual().start(() -> ...); // tek sanal thread
Örnek 1 (./Ornek1.java) 10.000 sanal thread görevini ucuza çalıştırır. Neden devrim? G/Ç
ağırlıklı sunucularda (her isteğe bir thread) artık karmaşık asenkron/reaktif kod yazmana gerek
kalmaz; basit, bloklayan kod yazarsın ve yine de ölçeklenir. Java 19 önizleme → Java 21
standart (topic 101).
Record Patterns (önizleme)
Record patterns, bir record'u parçalarına ayırarak (deconstruct) alanlarını doğrudan değişkenlere bağlar — özellikle iç içe record'larda güçlüdür:
if (cizgi instanceof Cizgi(Nokta(int ax, int ay), Nokta(int bx, int by))) { // ax, ay, bx, by doğrudan kullanılabilir } switch (sekil) { case Daire(Nokta(var cx, var cy), var r) -> ...; // tip + iç yapı }
Örnek 2 (./Ornek2.java) manuel getter zinciriyle record pattern'i karşılaştırır. switch ile
birleşince hem tipe hem iç yapıya göre dallanma sağlar. Java 19-20 önizleme → Java 21
standart.
Diğer Java 19 yenilikleri
- Structured Concurrency (inkübatör): İlişkili eşzamanlı görevleri tek birim olarak yönetme
(
StructuredTaskScope) — sanal thread'lerle birlikte güçlenir. - Pattern Matching for switch (önizleme, devam): switch'te tip desenleri +
whenkoşulları. - Foreign Function & Memory API (önizleme): JNI'nin halefi, yerel kod/bellek erişimi.
Özet
Java 19'un, Java'nın geleceğini belirleyen iki önizleme özelliğini — ucuz eşzamanlılık için sanal thread'ler (Örnek 1) ve veri ayrıştırma için record patterns (Örnek 2) — ilk kez getirdiğini öğrendik; structured concurrency ve FFM'ye değindik. Bu özelliklerin olgunlaşma sürecini bir sonraki sürümde sürdürüyoruz: Java 20.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Java 19 — Sanal Thread'ler (önizleme olarak ilk geldi; Java 21'de standart).
2// Çalıştırma: java Ornek1.java (JDK 21'de standart API ile çalışır)
3import java.util.concurrent.Executors;
4import java.util.concurrent.atomic.AtomicInteger;
5
6public class Ornek1 {
7
8 public static void main(String[] args) throws InterruptedException {
9 // Sanal thread: JVM'in yönettiği ÇOK HAFİF thread. Binlercesi ucuza oluşturulur.
10 // (Platform thread = işletim sistemi thread'i, pahalı; az sayıda olur.)
11 AtomicInteger biten = new AtomicInteger();
12
13 long t0 = System.currentTimeMillis();
14 // Her göreve bir SANAL thread atayan executor (Java 19 önizleme -> 21 standart):
15 try (var exec = Executors.newVirtualThreadPerTaskExecutor()) {
16 for (int i = 0; i < 10_000; i++) {
17 exec.submit(() -> {
18 try { Thread.sleep(50); } catch (InterruptedException ignored) {} // G/Ç beklemesi taklidi
19 biten.incrementAndGet();
20 });
21 }
22 } // try-with-resources: tüm görevler bitene kadar bekler
23 long sure = System.currentTimeMillis() - t0;
24
25 System.out.println("10.000 sanal thread görevi bitti: " + biten.get());
26 System.out.println("Süre: ~" + sure + " ms (10.000 platform thread'i bunu kaldıramazdı)");
27
28 // Tek bir sanal thread doğrudan da oluşturulabilir:
29 Thread sanal = Thread.ofVirtual().start(() -> System.out.println("Merhaba sanal thread!"));
30 sanal.join();
31 System.out.println("Sanal mı? " + sanal.isVirtual());
32
33 System.out.println("""
34
35 --- Java 19: Sanal Thread'ler (önizleme) ---
36 Sanal thread: JVM'in yönettiği, işletim sistemi thread'ine BAĞLI OLMAYAN çok hafif thread.
37 Binlerce/milyonlarca tane ucuza oluşturulur (platform thread MB'larca yığın ister, sanal ~az).
38 Java 19'da ÖNİZLEME, Java 21'de STANDART oldu (topic 101). 'Project Loom'un meyvesi.
39 Kazanç: G/Ç ağırlıklı sunucularda 'thread başına istek' modelini ucuza ölçekler;
40 karmaşık asenkron/reaktif kod yerine BASİT bloklayan kod yazarsın (okunabilir + ölçeklenir).
41 Java 19 ayrıca: structured concurrency (inkübatör), record patterns + switch patterns (önizleme).""");
42 }
43}Ornek2
çalıştırılabilir1// Ornek2: Java 19 — Record Patterns (önizleme; Java 21'de standart). İç içe veri ayrıştırma.
2// Çalıştırma: java Ornek2.java
3public class Ornek2 {
4
5 record Nokta(int x, int y) {}
6 record Cizgi(Nokta baslangic, Nokta bitis) {}
7
8 sealed interface Sekil permits Daire, Dikdortgen {}
9 record Daire(Nokta merkez, int yaricap) implements Sekil {}
10 record Dikdortgen(Nokta solUst, Nokta sagAlt) implements Sekil {}
11
12 public static void main(String[] args) {
13 Cizgi cizgi = new Cizgi(new Nokta(0, 0), new Nokta(3, 4));
14
15 // ÖNCESİ: alanları tek tek, elle çek (iç içe -> zincirleme getter).
16 int x1 = cizgi.baslangic().x(), y1 = cizgi.baslangic().y();
17 int x2 = cizgi.bitis().x(), y2 = cizgi.bitis().y();
18 System.out.println("Eski yol: (" + x1 + "," + y1 + ") -> (" + x2 + "," + y2 + ")");
19
20 // SONRASI (record patterns): tek desende İÇ İÇE parçalama -> alanlar doğrudan değişkenlere.
21 if (cizgi instanceof Cizgi(Nokta(int ax, int ay), Nokta(int bx, int by))) {
22 double uzunluk = Math.hypot(bx - ax, by - ay);
23 System.out.printf("Record pattern: uzunluk = %.1f%n", uzunluk);
24 }
25
26 // switch + record patterns: hem tip hem iç yapıya göre dallan.
27 Sekil[] sekiller = { new Daire(new Nokta(1, 1), 5), new Dikdortgen(new Nokta(0, 10), new Nokta(8, 0)) };
28 for (Sekil s : sekiller) {
29 String aciklama = switch (s) {
30 case Daire(Nokta(var cx, var cy), var r) -> "Daire @(" + cx + "," + cy + ") r=" + r;
31 case Dikdortgen(var su, var sa) -> "Dikdörtgen " + su + "-" + sa;
32 };
33 System.out.println(aciklama);
34 }
35
36 System.out.println("""
37
38 --- Java 19: Record Patterns (önizleme) ---
39 Record patterns: bir record'u 'parçalara ayırarak' (deconstruct) alanlarını doğrudan değişkenlere bağlar.
40 İÇ İÇE record'larda güçlüdür: Cizgi(Nokta(ax,ay), Nokta(bx,by)) -> dört alan tek satırda.
41 switch ile birleşince: hem TİP hem İÇ YAPIYA göre dallanma (pattern matching'in zirvesi).
42 Java 19-20 önizleme, Java 21 STANDART (topic 101). Manuel getter zincirine son verir, kodu okunaklı kılar.""");
43 }
44}