Java 17 Yenilikleri (2021, LTS)
Java 17, Java 11'den sonra üçüncü büyük LTS sürümüdür ve uzun süre modern Java'nın fiili standardı oldu. Java 9–16 arasında önizleme olarak olgunlaşan birçok özelliği standartlaştırdı; en önemlisi sealed sınıflardır.…
Java 17 Yenilikleri (2021, LTS)
Java 17, Java 11'den sonra üçüncü büyük LTS sürümüdür ve uzun süre modern Java'nın fiili standardı oldu. Java 9–16 arasında önizleme olarak olgunlaşan birçok özelliği standartlaştırdı; en önemlisi sealed sınıflardır. Bu konu, Java 17'nin getirdiklerini "öncesi vs sonrası" karşılaştırmalı örneklerle ele alır (örnekler JDK 21'de çalışır).
sealed sınıflar standart
Java 15'te önizleme olan sealed sınıflar, Java 17'de standart oldu. Bir tipin alt tiplerini
permits ile kısıtlar:
sealed interface Odeme permits Kart, Havale, Kripto {}
En büyük kazancı eksiksizlik (exhaustiveness) denetimidir: sealed bir tip üzerinde switch
yazarsan, derleyici tüm alt tipleri bildiği için default gerekmez — ve yeni bir alt tip
eklediğinde onu işlemeyen switch'leri derleme hatasıyla sana bildirir:
String s = switch (odeme) { case Kart k -> ...; case Havale h -> ...; case Kripto kr -> ...; // hepsi kapsandı -> default gerekmez };
Örnek 1 (./Ornek1.java) sealed olmadan (instanceof zinciri + zorunlu default) ve sealed ile
(eksiksiz switch) karşılaştırmasını gösterir.
Yeni RandomGenerator API (JEP 356)
Java 17 öncesinde tek bir java.util.Random vardı (tek, eski algoritma). Java 17, RandomGenerator
arayüzünü ve RandomGeneratorFactory'yi getirdi: artık farklı PRNG algoritmaları (kalite/hız/
atlama özelliklerine göre) seçilebilir ve akıcı ints/longs/doubles akışları üretilebilir.
Örnek 2 (./Ornek2.java) eski Random ile yeni API'yi karşılaştırır.
Diğer Java 17 yenilikleri
- Pattern matching for switch (önizleme; Java 21'de standart) — switch'te tip desenleri.
- Her zaman katı kayan nokta (
strictfpvarsayılan davranış). - macOS/AArch64 portu, yeni macOS renderlama.
- Kaldırılanlar: Applet API deprecated (topic 96), Security Manager deprecated, RMI Activation kaldırıldı.
Geçiş notu (11 → 17)
11'den 17'ye geçiş çoğunlukla sorunsuzdur ve şiddetle önerilir (11 destek sonuna yaklaşır).
Dikkat edilecekler: güçlü kapsülleme (strong encapsulation) artık varsayılan — iç JDK API'lerine
(sun.*) reflection ile erişen eski kod kırılabilir; kaldırılan/deprecated API'leri tara (topic 21).
Özet
Java 17'nin (LTS) öne çıkan yeniliklerini öğrendik: standartlaşan sealed sınıflar ve eksiksiz switch (Örnek 1) ile yeni RandomGenerator API'si (Örnek 2); pattern matching switch önizlemesi ve 11→17 geçiş notuna değindik. Sırada, UTF-8'i varsayılan yapan sürüm: Java 18.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Java 17 (LTS) — sealed sınıflar STANDART + eksiksiz (exhaustive) switch.
2// Çalıştırma: java Ornek1.java
3public class Ornek1 {
4
5 // Java 15-16'da önizleme olan sealed, Java 17'de STANDART oldu.
6 sealed interface Odeme permits Kart, Havale, Kripto {}
7 record Kart(double tutar) implements Odeme {}
8 record Havale(double tutar) implements Odeme {}
9 record Kripto(double tutar, String agParasi) implements Odeme {}
10
11 public static void main(String[] args) {
12 Odeme[] odemeler = { new Kart(250), new Havale(1000), new Kripto(500, "ETH") };
13
14 for (Odeme o : odemeler) {
15 // ÖNCESİ (sealed yokken): instanceof zinciri + default; derleyici eksiksizliği DENETLEYEMEZdi.
16 String eski;
17 if (o instanceof Kart k) eski = "Kart: " + k.tutar();
18 else if (o instanceof Havale h) eski = "Havale: " + h.tutar();
19 else if (o instanceof Kripto kr) eski = "Kripto: " + kr.tutar();
20 else eski = "bilinmeyen"; // default şart (derleyici tüm tipleri bilmez)
21
22 // SONRASI (Java 17 sealed): switch EKSİKSİZ; default GEREKMEZ.
23 // Yeni bir Odeme tipi eklersen derleyici bu switch'i güncellemeni ZORLAR (güvenlik).
24 String yeni = switch (o) {
25 case Kart k -> "Kart: " + k.tutar() + " TL (komisyon)";
26 case Havale h -> "Havale: " + h.tutar() + " TL (ücretsiz)";
27 case Kripto kr -> "Kripto: " + kr.tutar() + " " + kr.agParasi();
28 };
29 System.out.println(yeni);
30 }
31
32 System.out.println("""
33
34 --- Java 17 (LTS): sealed sınıflar standart ---
35 sealed: bir tipin alt tiplerini 'permits' ile KISITLAR (15 önizleme -> 17 STANDART).
36 Kazanç: switch'te EKSİKSİZLİK denetimi — default'a gerek kalmaz, derleyici tüm durumları zorlar.
37 Yeni alt tip eklersen, onu işlemeyen switch'ler DERLEME HATASI verir (sessiz hata yerine).
38 Java 17 ayrıca: pattern matching for switch (önizleme, 21'de standart), yeni RandomGenerator API'si (Örnek 2),
39 her zaman katı kayan nokta (strictfp varsayılan). 17, uzun yıllar en yaygın üretim LTS'i oldu.""");
40 }
41}Ornek2
çalıştırılabilir1// Ornek2: Java 17 — yeni RandomGenerator API (JEP 356), eski Random ile karşılaştırma.
2// Çalıştırma: java Ornek2.java
3import java.util.Random;
4import java.util.random.RandomGenerator;
5import java.util.random.RandomGeneratorFactory;
6
7public class Ornek2 {
8
9 public static void main(String[] args) {
10 // ÖNCESİ: tek bir Random sınıfı vardı; algoritma seçilemezdi.
11 Random eski = new Random(42); // sabit tohum -> tekrarlanabilir
12 System.out.print("Eski Random: ");
13 for (int i = 0; i < 5; i++) System.out.print(eski.nextInt(100) + " ");
14 System.out.println();
15
16 // SONRASI (Java 17): RandomGenerator arayüzü + farklı algoritmalar seçilebilir (JEP 356).
17 RandomGenerator yeni = RandomGeneratorFactory.of("L64X128MixRandom").create(42);
18 System.out.print("RandomGenerator (L64X128MixRandom): ");
19 for (int i = 0; i < 5; i++) System.out.print(yeni.nextInt(100) + " ");
20 System.out.println();
21
22 // Modern, akıcı yardımcılar: belli bir aralıkta akış (stream) üret
23 System.out.print("ints(5, 1, 7) -> 5 zar: ");
24 RandomGenerator.getDefault().ints(5, 1, 7).forEach(n -> System.out.print(n + " "));
25 System.out.println();
26
27 // Kullanılabilir algoritmaları listele:
28 long alg = RandomGeneratorFactory.all().count();
29 System.out.println("\nKullanılabilir PRNG algoritması sayısı: " + alg);
30
31 System.out.println("""
32
33 --- Java 17: RandomGenerator API ---
34 ÖNCESİ: yalnızca java.util.Random (tek algoritma, eski LCG). Algoritma seçimi yoktu.
35 SONRASI (JEP 356): RandomGenerator arayüzü + RandomGeneratorFactory ile PEK ÇOK algoritma
36 (L64X128MixRandom, Xoshiro256PlusPlus...). İhtiyaca göre kalite/hız/atlama (jump) seçilir.
37 Akıcı API: ints/longs/doubles ile aralıklı rastgele AKIŞ üretimi (stream).
38 Eski Random hâlâ çalışır (artık RandomGenerator'ı uygular); ama yeni kodda RandomGenerator tercih edilir.""");
39 }
40}