Java Sürümleri: Java 5'ten Java 17'ye Kadar Yenilikler, Özellikler ve Kod Örnekleri



 İşte Java 5'ten başlayarak Java 21'e kadar olan yeniliklerin daha detaylı bir açıklaması ve bazı kod örnekleri:

Java 5:

Generics: Jenerikler, tip güvenliği sağlamak ve tip dönüşümlerini önlemek için kullanılır. Örneğin, ArrayList sınıfı jenerik tipe sahiptir:


ArrayList<String> liste = new ArrayList<String>();

liste.add("Öğe 1");

liste.add("Öğe 2");

String deger = liste.get(0); // Dönüş değeri String olarak garanti edilir

Autoboxing/Auto-Unboxing: İlkel veri türleri ve sarma sınıfları arasında otomatik dönüşüm yapılmasını sağlar. Örneğin, aşağıdaki kod parçasında otomatik kutulama ve otomatik kutudan çıkarma gerçekleşir:


int sayi = 42; // Otomatik kutulama

Integer sayiObjesi = sayi; // Otomatik kutulama

int geriDonus = sayiObjesi; // Otomatik kutudan çıkarma

Enumerations: Sabit (enum) türü, belirli sabit değerleri temsil etmek için kullanılır. Örneğin:


enum HaftaninGunleri {

  PAZARTESI, SALI, CARSAMBA, PERSEMBE, CUMA, CUMARTESI, PAZAR

}


HaftaninGunleri gun = HaftaninGunleri.CUMARTESI;

if (gun == HaftaninGunleri.CUMARTESI) {

  System.out.println("Bugün Cumartesi");

}

Annotations: Anotasyonlar, kodu işaretlemek ve belirli davranışları eklemek için kullanılır. Örneğin:


@Deprecated

public class EskiSinif {

  // Bu sınıf artık önerilmez

}


@SuppressWarnings("unchecked")

public void bazMetot() {

  // Derleyici uyarılarını bastırır

}

Varargs: Değişken sayıda argümanları olan metodlara çağrı yapmak için kullanılır. Örneğin:


public int toplam(int... sayilar) {

  int toplam = 0;

  for (int sayi : sayilar) {

    toplam += sayi;

  }

  return toplam;

}


int sonuc = toplam(1, 2, 3, 4, 5); // 15


Java 6:

Scripting API: Java uygulamalarında dinamik betik dillerini kullanma imkanı sağlar. Örneğin, JavaScript betiği kullanarak Java kodunu çalıştırabilirsiniz:

import javax.script.*;


public class BetikOrnegi {

  public static void main(String[] args) throws Exception {

    ScriptEngineManager manager = new ScriptEngineManager();

    ScriptEngine engine = manager.getEngineByName("JavaScript");

    engine.eval("print('Merhaba, Dünya!');");

  }

}

JDBC 4.0: JDBC API'sinin yeni özellikleri, SQL sorgularını daha kolay ve verimli bir şekilde çalıştırmayı sağlar. Örneğin, otomatik olarak oluşturulan anahtarlar kullanarak veritabanına yeni kayıt ekleyebilirsiniz:

try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "kullanici", "sifre")) {

  String sql = "INSERT INTO Ogrenci (isim, soyisim) VALUES (?, ?)";

  try (PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {

    statement.setString(1, "Ahmet");

    statement.setString(2, "Yılmaz");

    int affectedRows = statement.executeUpdate();

    if (affectedRows > 0) {

      try (ResultSet generatedKeys = statement.getGeneratedKeys()) {

        if (generatedKeys.next()) {

          int id = generatedKeys.getInt(1);

          System.out.println("Yeni öğrenci ID'si: " + id);

        }

      }

    }

  }

} catch (SQLException e) {

  e.printStackTrace();

}

Pluggable Annotation Processing API: Anotasyon işleme için standart bir API sağlar. Bu API kullanılarak, anotasyonlara dayalı olarak kod üretebilir veya statik analiz yapabilirsiniz.

Java 7:

Switch ifadeleriyle String veri türü desteği: Artık switch ifadelerinde String ifadelerini kullanabilirsiniz. Örneğin:

String meyve = "elma";

switch (meyve) {

  case "elma":

    System.out.println("Elma seçildi.");

    break;

  case "armut":

    System.out.println("Armut seçildi.");

    break;

  default:

    System.out.println("Geçersiz meyve.");

}

Try-with-Kaynak ifadesi: Kaynakları otomatik olarak kapatmak için kullanılır. Örneğin, bir dosyayı okuyan bir try-with-resources bloğu:

try (BufferedReader reader = new BufferedReader(new FileReader("dosya.txt"))) {

  String satir;

  while ((satir = reader.readLine()) != null) {

    System.out.println(satir);

  }

} catch (IOException e) {

  e.printStackTrace();

}

Fork/Join Framework: Paralel programlamayı kolaylaştıran bir framework. Büyük işleri parçalara bölerek paralel olarak çalıştırabilirsiniz. İşte Fork/Join Framework kullanarak bir dizinin elemanlarını toplama örneği:

import java.util.concurrent.*;

public class ToplamaGorevi extends RecursiveTask<Integer> {

  private final int[] dizi;

  private final int baslangic;

  private final int bitis;


  public ToplamaGorevi(int[] dizi, int baslangic, int bitis) {

    this.dizi = dizi;

    this.baslangic = baslangic;

    this.bitis = bitis;

  }


  @Override

  protected Integer compute() {

    if (bitis - baslangic <= 5) {

      // Küçük bir parçaya geldiğimizde doğrudan toplama yaparız

      int toplam = 0;

      for (int i = baslangic; i < bitis; i++) {

        toplam += dizi[i];

      }

      return toplam;

    } else {

      // Dizi parçalarını ikiye böleriz ve her birini ayrı ayrı hesaplatırız

      int orta = (baslangic + bitis) / 2;

      ToplamaGorevi solGorev = new ToplamaGorevi(dizi, baslangic, orta);

      ToplamaGorevi sagGorev = new ToplamaGorevi(dizi, orta, bitis);


      solGorev.fork(); // Sol görevi paralel olarak çalıştır

      int sagSonuc = sagGorev.compute(); // Sağ görevi mevcut thread'de çalıştır

      int solSonuc = solGorev.join(); // Sol görevin tamamlanmasını bekler ve sonucu alır


      return solSonuc + sagSonuc;

    }

  }

}

Bu örnekte, ToplamaGorevi adında bir RecursiveTask sınıfı tanımlıyoruz. compute() metodu içinde, dizinin parçalarını bölüp her birini ayrı ayrı hesaplatıyoruz. Küçük parçalara ulaştığımızda, doğrudan elemanları topluyoruz. Daha büyük parçaları ikiye bölerek paralel olarak hesaplatıyoruz. Sol görevi fork() metoduyla paralel olarak çalıştırıyoruz ve sağ görevi mevcut thread'de çalıştırıyoruz. Sonuçları birleştirerek toplam sonucu elde ediyoruz.

Bu örnek, büyük veri kümesini parçalara bölerek paralel işleme yapmak için Fork/Join Framework'ün nasıl kullanılabileceğini göstermektedir.

Java 8:

Lambda Expressions: Kısa ve işlevsel bir şekilde anonim fonksiyonlar oluşturmayı sağlar. Örneğin, bir liste üzerindeki elemanları sıralama:

List<String> liste = Arrays.asList("Ahmet", "Mehmet", "Ayşe", "Fatma");

liste.sort((s1, s2) -> s1.compareTo(s2));

Functional Interfaces: Lambda ifadeleri için kullanılan arayüzlerdir. Örneğin, Consumer arayüzü bir tür alır ve hiçbir değer döndürmez:

List<String> liste = Arrays.asList("Ahmet", "Mehmet", "Ayşe", "Fatma");

liste.forEach((String s) -> System.out.println(s));

Stream API: İşleme sırasında koleksiyonlar üzerinde işlemler gerçekleştirmeyi kolaylaştırır. Örneğin, bir liste üzerinde filtreleme ve sıralama:

List<String> liste = Arrays.asList("Ahmet", "Mehmet", "Ayşe", "Fatma");

liste.stream()

     .filter(s -> s.startsWith("A"))

     .sorted()

     .forEach(System.out::println);

Date and Time API: Tarih ve saat işlemleri için geliştirilmiş yeni bir API sağlar. Örneğin, belirli bir tarih aralığındaki tüm Salı günlerini bulma:


LocalDate baslangicTarihi = LocalDate.of(2023, Month.JANUARY, 1);

LocalDate bitisTarihi = LocalDate.of(2023, Month.DECEMBER, 31);


List<LocalDate> saliGunleri = new ArrayList<>();

LocalDate tarih = baslangicTarihi;

while (tarih.isBefore(bitisTarihi)) {

  if (tarih.getDayOfWeek() == DayOfWeek.TUESDAY) {

    saliGunleri.add(tarih);

  }

  tarih = tarih.plusDays(1);

}

Java 9:

Modülerlik (Java Platform Module System): JDK ve uygulamaları modüller halinde düzenlemek ve dağıtmak için modülerlik sistemi tanıtıldı. Bu, Java platformunun daha küçük ve daha optimize edilebilir bileşenlere ayrılmasını sağlar.

Private Methods in Interfaces: Arayüzlerde artık özel (private) metotlar tanımlanabilir. Bu, arayüzlerdeki kodu daha iyi organize etmek ve paylaşılan kodu yeniden kullanmak için kullanışlıdır.

Try-with-Kaynak Geliştirmeleri: Try-with-kaynak ifadesine geliştirmeler yapıldı. Artık try bloğu içindeki kaynakları otomatik olarak kapatmak için kullanılan kaynak değişkenlerini final veya effectively final olmaları gerekmeksizin tanımlayabilirsiniz.

Java 10:

Local Variable Type Inference: var anahtar kelimesi, yerel değişkenlerin veri türünü derleyicinin çıkarsamasına bırakır. Bu, kodu daha kısa ve okunabilir hale getirir.

var sayi = 42; // int türünde bir değişken

var liste = new ArrayList<String>(); // ArrayList<String> türünde bir değişken

Garbage Collector Arayüzü: ZGC (Z Garbage Collector) adında yeni bir garbage collector tanıtıldı. Bu, büyük bellekli uygulamalarda düşük gecikme süreleriyle yüksek performans sağlamayı amaçlar.

Java 11:

HTTP Client API: Standart HTTP istemcisi sağlayan bir API eklendi. Bu, HTTP istekleri göndermek ve almak için kullanılabilir.


HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()

        .uri(URI.create("https://api.example.com/data"))

        .build();


HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

String responseBody = response.body();

String Metotları: String sınıfına birkaç yeni metot eklendi. Bunlar arasında isBlank(), lines(), repeat(), strip(), stripLeading() ve stripTrailing() gibi metotlar bulunur.

Java 12:

Switch Expressions: switch ifadesi, ifadeleri değerlendirmek ve sonuç döndürmek için kullanılabilir hale geldi.

int sayi = 2;

String sonuc = switch (sayi) {

  case 1, 2, 3 -> "Küçük sayı";

  case 4, 5, 6 -> "Orta sayı";

  default -> "Büyük sayı";

};

System.out.println(sonuc);

Compact Number Format: Yeni bir NumberFormat sınıfı eklendi. Bu, sayıları kısaltılmış bir biçimde göstermek için kullanılabilir.

Java 13:

Text Blocks: Çok satırlı metinleri daha okunaklı bir şekilde tanımlamak için Text Blocks (Metin Blokları) özelliği eklendi. Metin blokları üç çift tırnak içine alınır ve içerikteki boşluklar ve satır atlama karakterleri korunur.

java

Copy code

String metin = """

  Bu

  çok

  satırlı

  bir

  metindir.

  """;

Switch Expressions (Enhanced): Switch ifadeleri biraz daha geliştirildi ve yeni özellikler eklenerek daha kısa ve okunabilir hale getirildi.

String mevsim = "ilkbahar";

String aktivite = switch (mevsim) {

  case "ilkbahar", "yaz" -> "piknik";

  case "sonbahar" -> "yürüyüş";

  case "kış" -> "kayak";

  default -> "bilinmiyor";

};

System.out.println(aktivite);

Java 14:

Records: Records (Kayıtlar), sadece veri depolayan ve getter/setter gibi yöntemleri otomatik olarak sağlayan basit sınıfları tanımlamak için kullanılır. Bu, veri sınıflarının oluşturulmasını ve kullanılmasını kolaylaştırır.

record Ogrenci(String ad, String soyad) {

  // Otomatik olarak getter ve toString metotları sağlanır

}

Ogrenci ogrenci = new Ogrenci("Ahmet", "Yılmaz");

System.out.println(ogrenci.ad());

Switch Expressions (Pattern Matching): Switch ifadeleri için pattern matching özelliği eklenerek, ifadelerin içinde desen eşleme kullanılabilir hale getirildi.

Object obj = "merhaba";

String sonuc = switch (obj) {

  case String s -> "String: " + s;

  case Integer i -> "Integer: " + i;

  default -> "Bilinmiyor";

};

System.out.println(sonuc);

Java 15:

Sealed Classes: Kapalı (sealed) sınıflar, belirli alt sınıflara izin vererek sınıf hiyerarşisini kontrol etmeyi sağlar. Bu, sınıfların daha sıkı bir şekilde yönetilmesini ve korunmasını sağlar.

sealed interface Hayvan permits Kedi, Köpek, Kuş {

  // ...

}

final class Kedi implements Hayvan {

  // ...

}

Text Blocks (Enhanced): Metin blokları özelliği geliştirildi ve artık formatlama seçeneklerini destekler hale geldi.


String metin = """

  Merhaba, benim adım %s.

  Bugün %tA günü.

  """.formatted("Ahmet", new Date());

Java 16:

Pattern Matching for instanceof: instanceof ifadesi için pattern matching özelliği eklenerek, daha kolay ve okunabilir bir şekilde nesnelerin türünü kontrol etme imkanı sağlandı.

if (obj instanceof String str) {

  System.out.println(str.length());

}

Records (Enhanced): Records (Kayıtlar) özelliği geliştirildi ve equals(), hashCode() ve toString() gibi yöntemleri otomatik olarak sağlamaya devam ederken, diğer yöntemleri de manuel olarak tanımlama imkanı sağlandı.


record Ogrenci(String ad, String soyad) {

  public void selamVer() {

    System.out.println("Merhaba, ben " + ad + " " + soyad);

  }

}

Java 17:


Sealed Classes (Enhanced): Kapalı (sealed) sınıflar için bazı geliştirmeler yapıldı ve sealed sınıfların alt sınıflarının türlerine daha esnek bir şekilde izin verildi.


public sealed interface Hayvan permits Kedi, Köpek, Kuş {

  // ...

}


public non-sealed class Leopar implements Hayvan {

  // ...

}

Pattern Matching for switch: switch ifadeleri için pattern matching özelliği, daha karmaşık desenleri kontrol etme imkanı sağlayarak daha esnek bir kullanım sunar.


String sonuc = switch (obj) {

  case String s -> "String: " + s;

  case Integer i -> "Integer: " + i;

  case List<String> list -> "List: " + list.size();

  default -> "Bilinmiyor";

};

System.out.println(sonuc);

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال