Java 17

Paylaş

Java 17 ile gelen yenilikler Pattern Matching, Sealed Classes, Foreign Function & Memory API, Vector API ve diğer özellikler ile ilgili bilgiler ve kullanımı yer alıyor.

Restore Always-Strict Floating-Point Semantics – JEP 306

İlk Java sürümlerinde kayan nokta artimetiği platformlar arasında hatalı olduğundan strictfp anahtar kelimesiyle hassas olarak belirlenmesi gerekiyordu. İşlemci üreticilerini geliştirdiği özellikler sayesinde strictfp anahtar kelimesi kullanımına gerek kalmadan varsayılan olarak hassas olması sağlanarak her platformda aynı sonucu vermesini sağlamıştır.

Enhanced Pseudo-Random Number Generators – JEP 356

Rastgele sayısal değerler üretimi için RandomGenerator arayüzü eklenmiştir.

String algo = "Random";
RandomGenerator random = RandomGeneratorFactory.of(algo).create(44);
System.out.println("Random: " + random);

RandomGenerator defaultRandomGenerator = RandomGeneratorFactory.getDefault().create();
System.out.println("Default: " + defaultRandomGenerator);

algo = "Xoshiro256PlusPlus";
RandomGenerator xoshiroRandomGenerator = RandomGeneratorFactory.of(algo).create();
System.out.println("Xoroshiro: " + xoshiroRandomGenerator);

int randomNumber = xoshiroRandomGenerator.nextInt();
System.out.println("Random Number: " + randomNumber);

Arayüz ile birlike çeşitli rastgele sayısal değerler üretim yöntemleri eklenmiştir.

Tüm yöntemlere RandomGeneratorFactory üzerinden aşağıdaki gibi erişilebilir.

RandomGeneratorFactory.all()
        .map(f -> f.group() + ": " + f.name())
        .sorted()
        .forEach(System.out::println);

Java 17 öncesinde yer alan java.util.Random, SplittableRandom ve SecureRandom eski rastgele sayısal değerler üretim yöntemleri RandomGenerator arayüzünü uygulayacak uygulayacak şekilde düzenlenmiştir.

New macOS Rendering Pipeline – JEP 382

Apple OpenGL yerine daha iyi performans sağlayan Metal framework kullanmaktadır.

Java içerisinde yer alan AWT, Swing gibi görsel arayüz içerisinde yer alan ve Apple platformunda kullanılan OpenGL kütüphaneleri yerine Metal framework API geçiş yapılmıştır.

Bu değişiklik içsel olarak yapıldığından Java sınıflarının kullanımında herhangi bir değişiklik yapılmamıştır.

macOS/AArch64 Port – JEP 391

Apple macOS için AArch64 veya ARM64 işlemci desteği eklenmiştir.

Deprecate the Applet API for Removal – JEP 398

Java 9 ile birlikte kullanım dışı olan işaretlenen Applet API @Deprecated(since=”9″, forRemoval = true) olarak işaretlenerek kullanımdan kaldırılacak olarak işaretlenmiştir.

Strongly Encapsulate JDK Internals – JEP 403

JDK içerisinde yer alan sınıflara erişim Java 16 ile erişim için kullanılan –illegal-access parametresini kullanımı tamamen kaldırılmıştır.

Pattern Matching for switch (Preview) – JEP 406

Önceki Java sürümlerinde yer alan Pattern Matching özelliğinin kullanımı genişletilmiştir.

public static void main(String[] args) {
    System.out.println(formatter("Java 17"));
    System.out.println(formatter(17));

}

static String formatter(Object o) {
    String formatted = "unknown";
    if (o instanceof Integer i) {
        formatted = String.format("int %d", i);
    } else if (o instanceof Long l) {
        formatted = String.format("long %d", l);
    } else if (o instanceof Double d) {
        formatted = String.format("double %f", d);
    } else if (o instanceof String s) {
        formatted = String.format("String %s", s);
    }
    return formatted;
}

Yukarıdaki if-else kod parçasının yerine Pattern Matching özelliği kullanılarak yazılmış hali aşağıdaki gibidir.

public static void main(String[] args) {
    System.out.println(formatterPatternSwitch("Java 17"));
    System.out.println(formatterPatternSwitch(17));

}

static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}

Özelliğin null ifadelerinde kullanımı aşağıdaki gibidir.

public static void main(String[] args) {
    testFooBar(null);
    testFooBar("Foo");
    testFooBar("Bar");
    testFooBar("");
}

static void testFooBar(String s) {
    if (s == null) {
        System.out.println("oops!");
        return;
    }
    switch (s) {
        case "Foo", "Bar" -> System.out.println("Great");
        default           -> System.out.println("Ok");
    }
}

Yukarıdaki kod parçasının yerine Pattern Matching özelliği kullanılarak yazılmış hali aşağıdaki gibidir.

public static void main(String[] args) {
    testFooBar(null);
    testFooBar("Foo");
    testFooBar("Bar");
    testFooBar("");
}

static void testFooBar(String s) {
    switch (s) {
        case null         -> System.out.println("Oops");
        case "Foo", "Bar" -> System.out.println("Great");
        default           -> System.out.println("Ok");
    }
}

Özelliğin switch ifadelerinde kullanımı aşağıdaki gibidir.

class Shape {}
class Rectangle extends Shape {}
class Triangle  extends Shape { int calculateArea() { ... } }

static void testTriangle(Shape s) {
    switch (s) {
        case null:
            break;
        case Triangle t:
            if (t.calculateArea() > 100) {
                System.out.println("Large triangle");
                break;
            }
        default:
            System.out.println("A shape, possibly a small triangle");
    }
}

Yukarıdaki switch kod parçasının yerine Pattern Matching özelliği kullanılarak yazılmış hali aşağıdaki gibidir.

static void testTriangle(Shape s) {
    switch (s) {
        case Triangle t && (t.calculateArea() > 100) ->
            System.out.println("Large triangle");
        case Triangle t ->
            System.out.println("Small triangle");
        default ->
            System.out.println("Non-triangle");
    }
}

Özellik daha az kod ile daha fazla iş yapmayı sağlayarak karmaşık ifadelerin yazımını kolay hale getirmiştir.

Remove RMI Activation – JEP 407

Java 15 sürümünde kullanımı dışı olarak kaldırılacak olan işaretlenen RMI aktivasyon özelliği kaldırılmıştır.

Sealed Classes – JEP 409

Java 15 sürümünde gelen Sealed Classes özelliği standart hale gelerek Java’ya eklenmiştir.

Remove the Experimental AOT and JIT Compiler – JEP 410

Java 9 ve Java 10 sürümlerinde gelen deneysel AOT ve JIT desteği kaldırılmıştır.

Deprecate the Security Manager for Removal – JEP 411

Java kodlarının istemci tarafında güvenli olarak çalışması amacıyla geliştirilen Security Manager özelliği Apple API kaldırılması ile artık ihtiyaç olmadığından kullanımı dışı ve kullanımdan kaldırılacak olarak işaretlenmiştir.

Foreign Function & Memory API (Incubator) – JEP 412

Java 14 ile birlikte gelen Java tarafından yönetilmeyen bellek alanlarına erişimi sağlayan Foreign Function & Memory API (FFM API) geliştirilmeye devam etmektedir.

Özelliğin çalışması için –add-modules jdk.incubator.foreign parametrelerinin eklenmesi gerekmektedir.

Vector API (Second Incubator) – JEP 414

Java 16 ile birlikte gelen Vector API geliştirilmeye devam etmektedir.

Context-Specific Deserialization Filters – JEP 415

Java içerisinde yer alan bileşenlerin farklı formata dönüştürülmesi(Serialization) ve geri dönüştürülmesi(Deserialization) sırasında ortaya çıkan güvenlik sorunlarını gidermek için Java 9 ile birlikte gelen Filter Incoming Serialization Data (ObjectInputFilter) özelliğinin genişletir.

Java 9 ile birlikte gelen ObjectInputFilter arayüzüne eklenen statik metotlar sayesinde dönüşüm işlemleri daha güvenli hale getirilmiştir.

Diğer

Java 9 ile birlikte sürekli olarak güncellenen Java platformu Java 11’den sonraki LTS yani Uzun Süreli Destek sürümüdür.

Platform, güvenlik güncellemeleri ve yeni algoritmaların (PRNG, Xoshiro vb.) Java içerisinde dahil edildiği sürüm olmuştur.

Java Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlarda ilgini çekebilir


LinkedIn grubuna buradan katılın.