Java 18 Yenilikleri (2022)
Java 18, LTS olmayan bir ara sürümdür ve görece küçük ama pratikte hissedilen iyileştirmeler getirdi. En önemlisi, yıllardır süren bir taşınabilirlik sorununu çözen UTF-8'in varsayılan karakter kümesi olmasıdır (JEP 4…
Java 18 Yenilikleri (2022)
Java 18, LTS olmayan bir ara sürümdür ve görece küçük ama pratikte hissedilen iyileştirmeler
getirdi. En önemlisi, yıllardır süren bir taşınabilirlik sorununu çözen UTF-8'in varsayılan
karakter kümesi olmasıdır (JEP 400). Ayrıca komut satırından statik dosya sunan basit bir web
sunucusu (jwebserver) ekledi.
UTF-8 varsayılan (JEP 400)
Java 18 öncesinde, Charset.defaultCharset() işletim sistemine bağlıydı: Windows'ta genelde
windows-1252, Linux'ta UTF-8. Bu, charset belirtmeden yapılan işlemlerin aynı kodun farklı
makinelerde farklı sonuç vermesine yol açardı (mojibake — topic 87).
Java 18'den itibaren varsayılan charset her platformda UTF-8'dir:
Charset.defaultCharset(); // Java 18+ -> her zaman UTF-8
Örnek 1 (./Ornek1.java) bunu gösterir. Bu, taşınabilirliği artırır; yine de kritik G/Ç'de
charset'i açıkça belirtmek (topic 87) en güvenli pratiktir.
Basit web sunucusu (JEP 408)
Java 18, statik dosyaları sunan minimal bir HTTP sunucusu getirdi — hem komut satırı aracı
(jwebserver) hem programatik API (SimpleFileServer) olarak:
jwebserver -p 8000 # mevcut dizini web'de yayınla (Python http.server gibi)
var sunucu = SimpleFileServer.createFileServer( new InetSocketAddress("localhost", 0), kokDizin, OutputLevel.INFO); sunucu.start();
Amaç üretim değil; hızlı prototipleme, test, yerel dosya paylaşımı ve öğrenme. Örnek 2
(./Ornek2.java) programatik sunucuyu başlatır, bir dosya ister ve durdurur.
Diğer Java 18 yenilikleri
- Javadoc'ta
@snippet(JEP 413): Dokümana doğrulanabilir, biçimli kod parçacıkları gömme. - İnternet adresi çözümleme SPI (JEP 418): Özel host/IP çözümleyici takılabilmesi.
- Vector API (incubator, devam): SIMD hesaplamaları.
Özet
Java 18'in iki pratik yeniliğini öğrendik: taşınabilirliği artıran UTF-8 varsayılanı (JEP 400;
Örnek 1) ve hızlı kullanım için basit web sunucusu (jwebserver/SimpleFileServer; Örnek 2);
@snippet ve diğer eklemelere değindik. Sırada, sanal thread'lerin ilk göründüğü sürüm: Java 19.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Java 18 — UTF-8 artık VARSAYILAN karakter kümesi (JEP 400).
2// Çalıştırma: java Ornek1.java
3import java.nio.charset.Charset;
4
5public class Ornek1 {
6
7 public static void main(String[] args) {
8 // ÖNCESİ (Java 17 ve öncesi): varsayılan charset İŞLETİM SİSTEMİNE bağlıydı!
9 // Windows'ta genelde windows-1252, Linux'ta UTF-8 -> aynı kod farklı platformda farklı sonuç (mojibake riski).
10 // SONRASI (Java 18, JEP 400): varsayılan charset HER YERDE UTF-8.
11 Charset varsayilan = Charset.defaultCharset();
12 System.out.println("Varsayılan charset: " + varsayilan);
13 System.out.println("UTF-8 mü? " + varsayilan.name().equals("UTF-8")
14 + " (Java 18+ -> her platformda UTF-8)");
15
16 // file.encoding sistem özelliği de UTF-8'i yansıtır:
17 System.out.println("file.encoding: " + System.getProperty("file.encoding"));
18
19 // Etkisi: charset belirtmeden yapılan işlemler artık platformlar arası TUTARLI.
20 // (Yine de açıkça belirtmek en iyisidir — topic 87.)
21 byte[] b = "Şçğ".getBytes(); // charset verilmedi -> artık güvenle UTF-8
22 System.out.println("'Şçğ' varsayılan kodlamada " + b.length + " byte (UTF-8 -> Türkçe 2'şer byte)");
23
24 System.out.println("""
25
26 --- Java 18: UTF-8 varsayılan (JEP 400) ---
27 ÖNCESİ: Charset.defaultCharset() işletim sistemine bağlıydı (Windows-1252, MacRoman, UTF-8...).
28 Aynı kod farklı makinede farklı davranır, dosya/metin TAŞINABİLİRLİĞİ bozulur (mojibake).
29 SONRASI: varsayılan her platformda UTF-8. charset belirtmeyen API'ler artık tutarlı.
30 Java 18 ayrıca: basit web sunucusu (jwebserver / SimpleFileServer — Örnek 2), Javadoc'ta @snippet.
31 NOT: yine de kritik yerlerde charset'i AÇIKÇA belirt (getBytes(UTF_8)) — topic 87.""");
32 }
33}Ornek2
çalıştırılabilir1// Ornek2: Java 18 — basit dosya web sunucusu (SimpleFileServer / jwebserver, JEP 408).
2// Çalıştırma: java Ornek2.java
3import com.sun.net.httpserver.SimpleFileServer;
4import com.sun.net.httpserver.SimpleFileServer.OutputLevel;
5import java.net.InetSocketAddress;
6import java.net.URI;
7import java.net.http.HttpClient;
8import java.net.http.HttpRequest;
9import java.net.http.HttpResponse;
10import java.nio.file.Files;
11import java.nio.file.Path;
12
13public class Ornek2 {
14
15 public static void main(String[] args) throws Exception {
16 // Sunulacak içeriği bir geçici dizine hazırla.
17 Path kok = Files.createTempDirectory("jweb-");
18 Files.writeString(kok.resolve("index.html"), "<h1>Merhaba Java 18 web sunucusu!</h1>");
19
20 // Java 18: tek satırda statik dosya sunucusu (komut satırından 'jwebserver' olarak da var).
21 var sunucu = SimpleFileServer.createFileServer(
22 new InetSocketAddress("localhost", 0), kok, OutputLevel.NONE);
23 sunucu.start();
24 int port = sunucu.getAddress().getPort();
25 System.out.println("Basit dosya sunucusu: http://localhost:" + port + "/ (kök: " + kok.getFileName() + ")");
26
27 // İstemciyle index.html'i iste:
28 HttpResponse<String> cevap = HttpClient.newHttpClient().send(
29 HttpRequest.newBuilder(URI.create("http://localhost:" + port + "/index.html")).build(),
30 HttpResponse.BodyHandlers.ofString());
31 System.out.println("Durum: " + cevap.statusCode() + " | gövde: " + cevap.body());
32
33 sunucu.stop(0);
34 Files.deleteIfExists(kok.resolve("index.html"));
35 Files.deleteIfExists(kok);
36
37 System.out.println("""
38
39 --- Java 18: basit web sunucusu (JEP 408) ---
40 SimpleFileServer / komut satırında 'jwebserver': statik dosyaları sunan minimal HTTP sunucusu.
41 Amaç ÜRETİM DEĞİL; hızlı prototipleme, test, dosya paylaşımı, öğrenme.
42 'jwebserver -p 8000' ile mevcut dizini tek komutla web'de yayınlarsın (Python'un http.server'ı gibi).
43 Programatik API (bu örnek): createFileServer(adres, kökDizin, çıktıSeviyesi) -> HttpServer.
44 Gerçek uygulama için Spring Boot / tam HttpServer kullanılır.""");
45 }
46}