Java 10 Yenilikleri (2018)
Java 10, yarı yıllık sürüm temposunun ilk adımıydı ve görece küçük ama günlük kodda çok hissedilen bir yenilikle öne çıktı: var (yerel değişken tip çıkarımı). Ayrıca değişmez koleksiyon oluşturmayı kolaylaştıran topla…
Java 10 Yenilikleri (2018)
Java 10, yarı yıllık sürüm temposunun ilk adımıydı ve görece küçük ama günlük kodda çok hissedilen
bir yenilikle öne çıktı: var (yerel değişken tip çıkarımı). Ayrıca değişmez koleksiyon
oluşturmayı kolaylaştıran toplayıcılar ve Optional iyileştirmeleri getirdi.
var: yerel değişken tip çıkarımı
var, bir yerel değişkenin tipini sağ taraftaki ifadeden çıkarır. Çok önemli bir nokta: bu,
JavaScript'teki gibi dinamik tip değildir; kod hâlâ tam statik tiplidir, derleyici tipi
çıkarır:
var sayi = 42; // int var liste = new ArrayList<String>(); // ArrayList<String> var harita = new HashMap<String, List<Integer>>(); // uzun jeneriği tekrar yazmaktan kurtarır for (var e : harita.entrySet()) { ... }
Asıl faydası okunabilirliktir: uzun jenerik tipleri (Map<String, List<Integer>>) iki kez
yazmaktan kurtarır. Örnek 1 (./Ornek1.java) çeşitli kullanımları gösterir.
var'ın sınırları
var yalnızca yerel değişkenlerde çalışır ve şunlar yasaktır:
- Başlangıç değeri olmadan:
var x;❌ (tip çıkarılamaz) null'dan:var y = null;❌- Alan (field), metot parametresi, dönüş tipi olarak ❌
- Lambda'ya doğrudan:
var f = () -> 1;❌ (hedef tip belli değil)
İyi uygulama: Sağ taraf tipi açıkça belliyse (
new ..., açık bir metot dönüşü)varkullan. Tip okuyana net değilse (örn.var x = hesapla();) açık tip yaz. Amaç okunabilirliktir, kısalık değil.
Değişmez kopyalar
Java 10, savunmacı kopyalama (defensive copy) için pratik araçlar ekledi:
List.copyOf(c); Set.copyOf(c); Map.copyOf(c); // mevcut koleksiyonun DEĞİŞMEZ kopyası stream.collect(Collectors.toUnmodifiableList()); // stream sonucunu doğrudan değişmez topla
copyOf, kaynağın o anki içeriğinin değişmez bir kopyasını verir; kaynağı sonradan değiştirmek
kopyayı etkilemez. Bu, bir metottan koleksiyon döndürürken iç durumu korumak için idealdir. Örnek
2 (./Ornek2.java) bunu ve Collectors.toUnmodifiableList'i gösterir.
Optional.orElseThrow()
Argümansız orElseThrow(), get()'in niyeti daha net ifade eden hali olarak eklendi: değer
yoksa NoSuchElementException atar. Artık "değer kesinlikle var" demek istediğinde get() yerine
orElseThrow() yazman önerilir.
Özet
Java 10'un öne çıkan yeniliklerini öğrendik: kodu kısaltan ve okunabilirlik sağlayan var (ve
sınırları; Örnek 1); savunmacı kopya için değişmez kopyalar (copyOf, toUnmodifiableList) ve
Optional.orElseThrow() (Örnek 2). var bugün her yerde kullanılır. Sırada, ikinci LTS ve
zengin eklemeler: Java 11 yenilikleri.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Java 10 — var (yerel değişken tip çıkarımı).
2// Çalıştırma: java Ornek1.java
3import java.util.ArrayList;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Map;
7
8public class Ornek1 {
9
10 public static void main(String[] args) {
11 // var: tip SAĞ taraftan ÇIKARILIR. Statik tipleme korunur (dinamik değil!).
12 var sayi = 42; // int
13 var metin = "merhaba"; // String
14 var liste = new ArrayList<String>(); // ArrayList<String>
15 var harita = new HashMap<String, List<Integer>>(); // uzun jenerik tip -> kısalır
16
17 liste.add("a"); liste.add("b");
18 harita.put("kareler", List.of(1, 4, 9));
19 System.out.println("sayi=" + sayi + " (tip: int), metin=" + metin);
20 System.out.println("liste=" + liste + ", harita=" + harita);
21
22 // Döngülerde okunabilirlik:
23 for (var e : harita.entrySet()) {
24 System.out.println(" " + e.getKey() + " -> " + e.getValue());
25 }
26 for (var i = 0; i < 3; i++) System.out.print(i + " ");
27 System.out.println();
28
29 // var YALNIZCA yerel değişkenlerde çalışır. Çalışmadığı yerler (yorumda):
30 // var x; // HATA: başlangıç değeri yok (tip çıkarılamaz)
31 // var y = null; // HATA: null'dan tip çıkarılamaz
32 // alan/parametre/dönüş tipinde var KULLANILAMAZ.
33
34 System.out.println("""
35
36 --- Java 10: var (yerel tip çıkarımı) ---
37 var, yerel değişkenin tipini SAĞ taraftan çıkarır; kod hâlâ STATİK tiplidir (JS'teki var değil!).
38 Faydası: uzun jenerik tipleri tekrar yazmaktan kurtarır (Map<String,List<Integer>>...).
39 Sınır: yalnızca yerel değişkende; başlangıç değeri zorunlu; null/lambda'ya doğrudan atanamaz.
40 İyi uygulama: sağ taraf tipi açıkça belli olduğunda kullan; okunabilirliği düşürüyorsa kullanma.""");
41 }
42}Ornek2
çalıştırılabilir1// Ornek2: Java 10 — değişmez kopyalar (List.copyOf, toUnmodifiable...) ve Optional.orElseThrow().
2// Çalıştırma: java Ornek2.java
3import java.util.ArrayList;
4import java.util.List;
5import java.util.Optional;
6import java.util.stream.Collectors;
7
8public class Ornek2 {
9
10 public static void main(String[] args) {
11 // List.copyOf: var olan koleksiyonun DEĞİŞMEZ bir kopyasını verir.
12 var degisken = new ArrayList<>(List.of(1, 2, 3));
13 var degismez = List.copyOf(degisken);
14 degisken.add(4); // kaynağı değiştirmek kopyayı ETKİLEMEZ
15 System.out.println("kaynak: " + degisken + " | copyOf (değişmez): " + degismez);
16 try {
17 degismez.add(99);
18 } catch (UnsupportedOperationException e) {
19 System.out.println("değişmez listeye ekleme reddedildi (beklenen)");
20 }
21
22 // Collectors.toUnmodifiableList/Set/Map: stream sonucunu doğrudan değişmez topla.
23 List<Integer> kareler = degisken.stream()
24 .map(n -> n * n)
25 .collect(Collectors.toUnmodifiableList());
26 System.out.println("toUnmodifiableList: " + kareler);
27
28 // Optional.orElseThrow() (argümansız): boşsa NoSuchElementException.
29 Optional<String> dolu = Optional.of("değer");
30 System.out.println("orElseThrow: " + dolu.orElseThrow());
31 try {
32 Optional.empty().orElseThrow();
33 } catch (Exception e) {
34 System.out.println("boş Optional.orElseThrow -> " + e.getClass().getSimpleName());
35 }
36
37 System.out.println("""
38
39 --- Java 10: değişmez kopyalar + Optional.orElseThrow ---
40 List/Set/Map.copyOf(c): mevcut koleksiyonun değişmez (immutable) kopyası — savunmacı kopya için ideal.
41 Collectors.toUnmodifiableList/Set/Map: stream sonucunu doğrudan değişmez topla.
42 Optional.orElseThrow(): get()'in okunması daha net hali; boşsa NoSuchElementException atar.
43 Değişmezlik, paylaşılan veride hataları ve yan etkileri azaltır (güvenli tasarım).""");
44 }
45}