Java 15

Java 15 sürümü ile birlikte gelen sealed classes, hidden classes ve diğer özellikler ile ilgili bilgiler ve kullanımı yer alıyor.

Edwards-Curve Digital Signature Algorithm – JEP 339

Şifreleme/kriptolama algoritmalarına Edwards-Curve Digital Signature olarak adlandırılan EdDSA, Ed25519 ve Ed448 algoritmaları eklenmiştir.

public class App {

    public static void main(String[] args) throws Exception {
        String algo = "EdDSA"; // Ed25519, Ed448
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algo);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        Signature signature = Signature.getInstance(algo);
        signature.initSign(keyPair.getPrivate());
        byte[] data = "yusufsezer.com".getBytes();
        signature.update(data);

        String encodeStr = Base64.getEncoder().encodeToString(signature.sign());
        System.out.println(encodeStr);
    }

}

Sealed Classes – JEP 360

Önemli bir OOP-NYP özelliği olan kalıtım tekrar kullanılabilirliği arttırmaktadır.

Ancak bazen tekrar kullanılabilirlik istenmeyebilir veya sadece belirli sınıf ve arayüzlerin kullanılmasına izin verilebilir.

Java içerisinde yer alan final anahtar kelimesi bir sınıfın kalıtım ile genişletilemeceğini ifade eder.

Sadece belirli sınıf ve arayüzler için genişletme yapma veya kısıtlama gibi bir özellik Java içerisinde yoktur.

Java 15 ile birlikte gelen sealed, permits ve non-sealed anahtar kelimeleri ile sadece belirli sınıf ve arayüzlere genişleme özelliği verebilme gelmiştir.

Aşağıdaki ifadede Account sınıfı sadece SavingsAccount ve SavingsAccount tarafından kalıtım alabilecektir.

public class App {

    public static void main(String[] args) {}

    // sealed
    public sealed class Account permits SavingsAccount, CheckingAccount {}
    // final
    public final class SavingsAccount extends Account {}
    public final class CheckingAccount extends Account{}
    // not permits
    public class VirtualAccount extends Account{}

}

Sınıf aşağıdaki komut ile derlenmeye çalışılabilir.

javac --enable-preview --source 15 App.java

Derleyici, derleme işlemi sırasında aşağıdaki uyarıyı verecektir.

class is not allowed to extend sealed class: App.Account

permits ile belirtilen sınıflar final, sealed, non-sealed anahtar kelimelerinden birini kullanmalıdır.

Kalıtım alınmaya kapanan bir sınıf non-sealed ile alt sınıf tarafından tekrar kalıtım özelliğini aktif edilebilir.

public non-sealed class OtherAccount extends Account{}

Özellik sınıf(class), soyut sınıf(abstract class) ve arayüz(interface) tarafından kullanılabilmektedir.

Anahtar kelimenin kullanıldığı sınıf hakkında bilgi almak amacıyla Java Reflection içerisine aşağıda metotlar eklenmiştir.

java.lang.constant.ClassDesc[] getPermittedSubclasses();
boolean isSealed()

NOT: Özelliğin kullanımı için –enable-preview –source 15 App.java parametrelerinin eklenmesi gerekmektedir.

Hidden Classes – JEP 371

Gizli sınıflar veya gizlenmiş sınıflar doğrudan kullanılmayan sınıflar Java 15 ile birlikte gelmiştir.

Kullanım için bir sınıfı hazırlayıp derleyelim.

public class MerhabaDunya {

    public static void yazdir() {
        System.out.println("yusufsezer.com.tr");
    }

}
javac MerhabaDunya.java

Derledikten sonra üretilen kodu okuyarak defineHiddenClass metodu ile bilgilerine ulaşalım.

public class App {

    public static void main(String[] args) throws Exception {
        byte[] bytes = Files
                .readAllBytes(Paths.get("MerhabaDunya.class"));
        Class<?> clazz = MethodHandles
                .lookup().defineHiddenClass(bytes, true,
                        MethodHandles.Lookup.ClassOption.NESTMATE)
                .lookupClass();
        System.out.println(clazz.getName());
    }
}

Hidden Classes özelliği ile dinamik olarak çalışma zamanında derlenen sınıfı Java Reflection ile dolaylı olarak kullanabildik.

Remove the Nashorn JavaScript Engine – JEP 372

Java 8 ile birlikte gelen Nashorn JavaScript Engine Java 11 ile deprecated olarak işaretlenmiş ve Java 15 ile birlikte tamamen kaldırılmıştır.

Reimplement the Legacy DatagramSocket API – JEP 373

Java 1.0 sürümünden beri kullanılan DatagramSocket API Java 13 sürümünde güncellenen Socket API gibi yeniden düzenlenmiştir.

Disable and Deprecate Biased Locking – JEP 374

Varsayılan olarak aktif gelen ve eski Hashtable and Vector sınıflarında performans için kullanılan biased locking özelliği varsayılan olarak devre dışı gelmektedir.

Özelliği aktif hale getirmek için -XX:+UseBiasedLocking parametresinin eklenmesi yeterli olacaktır.

Özellik kullanıldığında deprecate uyarısı verecektir.

VM warning: Option UseBiasedLocking was deprecated in version 15.0 and will likely be removed in a future release.

Pattern Matching for instanceof (Second Preview) – JEP 375

Java 14 ile birlikte gelen Pattern Matching özeliğinde herhangi bir değişiklik yapılmamış devamı niteliğindeki geliştirme teklifi kodudur.

ZGC: A Scalable Low-Latency Garbage Collector (Production) – JEP 377

Java 11 sürümünde JEP 333 ile gelen çöp toplayıcında çeşitli yeni özellikler eklenip, hatalar giderilerek kullanılabilir hale gelmiştir.

Özelliğin kullanımı için -XX:+UseZGC parametresini eklemek yeterli olacaktır.

Text Blocks – JEP 378

Java 13 ve Java 14 sürümlerinde deneysel olarak yer alan özellik kalıcı olarak eklenmiştir.

Shenandoah: A Low-Pause-Time Garbage Collector (Production) – JEP 379

Java 12 sürümünde deneysel olarak gelen Shenandoah çöp toplayıcı kullanılabilir hale gelmiştir.

Özelliğin kullanımı için -XX:+UseShenandoahGC parametresini eklemek yeterli olacaktır.

NOT: Özellik varsayılan olarak bazı OpenJDK ile gelmemektedir.

Remove the Solaris and SPARC Ports – JEP 381

Java 14 sürümünde deprecated olarak belirlenen Solaris ve SPARC işletim sistemi desteği kaldırılmıştır.

Foreign-Memory Access API (Second Incubator) – JEP 383

Java 14 ile birlikte gelen Java tarafından yönetilmeyen bellek alanlarına erişim geliştirilmeye devam etmektedir.

public class App {

    public static void main(String[] args) {
        VarHandle varHandle = MemoryHandles.varHandle(long.class, ByteOrder.nativeOrder());
        try (MemorySegment segment = MemorySegment.allocateNative(8)) {
            MemoryAddress base = segment.baseAddress();
            System.out.println(base);
            varHandle.set(base, 123L);
            System.out.println(varHandle.get(base));
        }
    }
}

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

Records (Second Preview) – JEP 384

Java 14 ile birlikte gelen records özelliğine sealed kullanımı, metot içinde tanımlama, annotations kullanımı özellikleri eklendi.

public sealed interface Expr
    permits ConstantExpr, PlusExpr, TimesExpr, NegExpr {...}

public record ConstantExpr(int i)       implements Expr {...}
public record PlusExpr(Expr a, Expr b)  implements Expr {...}
public record TimesExpr(Expr a, Expr b) implements Expr {...}
public record NegExpr(Expr e)           implements Expr {...}

Metot içerisinde kullanımı aşağıdaki gibidir.

List<Merchant> findTopMerchants(List<Merchant> merchants, int month) {

    // metot içerisinde record tanımı
    record MerchantSales(Merchant merchant, double sales) {
    }

    return merchants.stream()
            .map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
            .sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
            .map(MerchantSales::merchant)
            .collect(toList());
}

Annotation kullanımı aşağıdaki gibidir.

public record Card(@MyAnno Rank rank, @MyAnno Suit suit) { ... }

Deprecate RMI Activation for Removal – JEP 385

Java 15 ile birlikte RMI aktivasyon özelliği deprecate olmuştur ve ileriki sürümlerde kaldırılması planlanmaktadır.

Diğer

Java 9 ile birlikte sürekli olarak güncellene Java, 15 sürümüyle birlikte gelen sealed class, hidden class özellikleri öne çıkmaktadır.

Performans ve hız konusunda sürekli olarak eleştirilen Java geliştirdiği çöp toplayıcılar, farklı bellek alanına erişim gibi özelliker ile eleştirileri en aza indirmeye çalışmaktadır.

Java Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.


Bunlara'da bakmalısın!