Java 18
Java 18 ile gelen yenilikler Deprecate Finalization for Removal, Pattern Matching for switch, UTF-8 by Default ve diğer özellikler ile ilgili bilgiler ve kullanımı yer alıyor.
UTF-8 by Default – JEP 400
Özellik Java IO sınıflarında varsayılan olarak UTF-8 karakter setinin kullanılacağını ifade eder. Özellikle birlikte önceki Java sürümlerinde platformlar arasında uyumsuzluk giderilerek geniş karakter desteğine sahip UTF-8 varsayılan olarak kullanılacağını belirtir.
Simple Web Server – JEP 408
Java kurulumuyla statik dosya sunmak için basit web sunucu aracı jwebserver ile birlikte gelir.
Araç çalıştırıldığı dizine HEAD ve GET yöntemleri ile erişmeyi sağlar.
jwebserver
Dizine http://127.0.0.1:8000/ adresi üzerinden erişim sağlanır.
Araç port(-p, –port), dizin(-d, –directory) gibi değerleri değiştirmek için parametre değerleri alabilir.
Tüm parametreler için -h parametresi kullanılabilir.
Code Snippets in Java API Documentation – JEP 413
Kod açıklamalarına kod örnekleri eklemek için kullanılacak @snippet etiketini ifade eder.
/**
* The following code shows how to use {@code Optional.isPresent}:
* {@snippet :
* if (v.isPresent()) {
* System.out.println("v: " + v.get());
* }
* }
*/
Özellik farklı dosyadaki kodları dahil etmek için file ve region niteliklerine sahiptir.
/**
* The following code shows how to use {@code Optional.isPresent}:
* {@snippet file="ShowOptional.java" region="example"}
*/
Kod örneği @start ve @end etiketleri ile belirtilir.
public class ShowOptional {
void show(Optional<String> v) {
// @start region="example"
if (v.isPresent()) {
System.out.println("v: " + v.get());
}
// @end
}
}
Özellikle ile birlikte gelen @highlight etiketi ile belirtilen vurgulanabilir.
/**
* A simple program.
* {@snippet :
* class HelloWorld {
* public static void main(String... args) {
* System.out.println("Hello World!"); // @highlight substring="println"
* }
* }
* }
*/
Özellikle ile birlikte gelen @link etiketi ile bağlantı verilebilir.
/**
* A simple program.
* {@snippet :
* class HelloWorld {
* public static void main(String... args) {
* System.out.println("Hello World!"); // @link substring="System.out" target="System#out"
* }
* }
* }
*/
javadoc aracı ile kullanıldığında oluşturulan dokümantasyonu daha okunaklı hale getirecektir.
Reimplement Core Reflection with Method Handles – JEP 416
Çalıştırma zamanında Java komutları ile ilgili işlemler yapmak için kullanılan Java Reflection içsel olarak geliştirilmiştir.
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.
Java Reflection hakkında detaylı bilgi almak için Java Reflection yazıma bakmalısın.
Vector API (Third Incubator) – JEP 417
Java 16 ile birlikte gelen ve Java 17 ile devam Vector API geliştirilmeye devam etmektedir.
Internet-Address Resolution SPI – JEP 418
Java içerisinde varsayılan adress çözümleyici olarak kullanılan java.net.InetAddress işletim sistemini kullanır.
InetAddress ip = InetAddress.getByName("yusufsezer.com.tr");
System.out.println("IP: " + ip);
Özellik ile birlikte java.net.InetAddress sınıfına SPI desteği eklenerek adres çözümleyiciyi dinamik olarak seçmeyi sağlar.
ServiceLoader.load(InetAddressResolverProvider.class)
.forEach(System.out::println);
Foreign Function & Memory API (Second Incubator) – JEP 419
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.
Pattern Matching for switch (Second Preview) – JEP 420
Önceki Java sürümlerinde yer alan Pattern Matching özelliğinin kullanımı genişletilmiştir.
Aşağıdaki kod parçasında Pattern Matching özelliği CharSequence ve String aynı türden olduğu için artık hata verecektir.
static void error(Object o) {
switch(o) {
case CharSequence cs ->
System.out.println("A sequence of length " + cs.length());
case String s -> // Error - pattern is dominated by previous pattern
System.out.println("A string: " + s);
default -> {
break;
}
}
}
Pattern Matching özelliğiyle birlikte switch ifadesi kullanıldığında tüm durumların belirlenmesi gerekir.
Aşağıdaki kod hata verecektir.
static int coverage(Object o) {
return switch (o) { // Error - not exhaustive
case String s -> s.length();
case Integer i -> i;
};
}
Hatanın giderilmesi için default anahtar kelimesiyle varsayılan değer kullanılabilir.
static int coverage(Object o) {
return switch (o) {
case String s -> s.length();
case Integer i -> i;
default -> 0;
};
}
Deprecate Finalization for Removal – JEP 421
Java 18 ile birlikte finalize() metodu @Deprecated(since=”9″, forRemoval = true) olarak işaretlenmiştir.
Java içerisinde finalize metodu kaynakların serbest bıraklması sırasında kullanılmak üzere yer alır.
Bellek yönetimi sırasında kullanımında çeşitli hatalı ve tehlikeli kullanıma neden olmaktaydı.
Aşağıdaki kod parçasında bir dosyanın diğer dosyaya kopyalanması yer almaktadır.
FileInputStream input = null;
FileOutputStream output = null;
try {
input = new FileInputStream(file1);
output = new FileOutputStream(file2);
... copy bytes from input to output ...
output.close(); output = null;
input.close(); input = null;
} finally {
if (output != null) output.close();
if (input != null) input.close();
}
Kopyalama sırasında oluşan herhangi bir hata sonras finally bloğu çalışır. Ancak finally bloğunda oluşabilecek dosyanın açık kalmasına ve bellek sızıntısına neden olmaktadır.
Yukarıdaki kod parçası yerine Java 7 ile birlikte gelen try-with-resources özelliği aşağıdaki gibi kullanılabilir.
try (FileInputStream input = new FileInputStream(file1);
FileOutputStream output = new FileOutputStream(file2)) {
... copy bytes from input to output ...
}
Diğer bir yöntem ise Java 9 ile birlikte gelen Cleaner sınıfını kullanmaktır.
Cleaner cleaner = Cleaner.create();
cleaner.register(input, ()->{
System.out.println("input clean");
});
cleaner.register(output, ()->{
System.out.println("output clean");
});
Diğer
Java 18 ile yenilikler arasında finalize metodunun kaldırılması, UTF-8 karekter kodunun varsayılan olması ve Code Snippets özellikleri öne çıkmaktadır.
Java Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.