Eğitim Portalı/Java/Java 10 Yenilikleri (2018)
Java01-java/56-java10-yenilikleri

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üşü) var kullan. 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ılabilir
Ornek1.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.