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 alınamayacağını 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 ifade de Account sınıfı sadece SavingsAccount ve SavingsAccount tarafından kalıtım alınabilecektir.
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 eklenmiştir.
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ş 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 özellikler ile eleştirileri en aza indirmeye çalışmaktadır.
Java Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.