JAVA 9 ve YENİLİKLERİ

Bence yeniliklerinin en önemlisi ahead-of-time olan java platformu sürümü. ahead-of-time standart bir native compiler gibi optimize edilmiş makine kodları üretir. Bu da performans açısından büyük bir kazanç demek oluyor, ancak bu özellik yalnızca 64 bit linux işletim sistemlerinde kullanılabilecek. Zannedersem kernel ile program arasındaki bazı katmanlar kalkınca windows’un çekirdeğiyle uğraşmak istemediler.

  • Java REPL – JSHELL (Java Shell)

Repl nedir?’ sorusuna yanıtlamak gerekirse; bir Shell arayüzüdür ve bu arayüz üzerinden girilen her kod, satırları okunarak çalıştırılır ve sonuçlar ekrana yazdırılır. Bir nevi komut satırı istemcisidir. Java’nın REPL’i ise Jshell adıyla resmi olarak yayınlanmıştır. Böylece komut ekranı üzerinden kod parçaları yazılabilir ve direkt olarak yine burada çalıştırılabilir hale geldi. Artık özellikle küçük kod parçaları çalıştırmak istediğinizde dosyalar oluşturup derleyip çalıştırmaya ihtiyaç kalmadı.

Ek olarak noktalı virgülsüz de çalıştırabileceğiniz bir komut ekranı geldi. Burada istediğiniz kodları doğrudan çalıştırabilirsiniz. Oracle bu araç ile birlikte özellikle yeni başlayanlar ve pratik yapmak isteyenler için bire bir ortam sağlamış oldu.

  • Yeni Modül Sistemi

Java 9’dan önceki sürümlerde monolitik paketler (jarlar) ile Java tabanlı uygulamalar geliştiriyorduk. Yani bir Java projesi geliştirirken jar paketinin tamamını eklemek zorunluluğu projedeki dosya sayısını da artırıyordu.

Burada iki önemli sorun var. Bunlardan birisi kodu encapsulate etmek ve farklı modüller ile olan bağımlılıkları kontrol etmek. Diğeri ise dosya yollarını düzenlemenin zorluğu, tekrar eden dosyaların varlığına yol açmasıdır. Bunlara çözüm olarak Java 9 ile birlikte yeni bir Modül Sistemi geldi.

Artık her modül kendine ait bir tanımlayıcı içeriyor. “requires” kısmı bağlı olan modüler belirtilebiliyor. Buna ek olarak “exports” kısmında paketler arası erişilebilirlik yönetilebiliyor.

Aşağıda küçük bir örnek bulabilirsiniz;

module-info.java module blog {   exports com.thy.blog;   requires modules; }

 

Bu modüle descriptor sayesinde java modül yönetimi sağlayarak daha önce bahsettiğim iki sorunu da çözüyor.

  • Process API Değişiklikleri

Process Api, işletim sistemi içerisinde bazı proseslerin yönetimi için kullanılır ve Java Sanal Makinesini kullanarak bu işlevi yürütür. Bu API’yi kullanarak prosesi çalıştırabilir, duraklatabilir, kapatabilirsiniz.

            Proccess sınıfında child veya daha alt prosesleri tanımlamanıza, bu proseslerin PID’sini (process id) öğrenmenize, bu prosesler hakkında bilgileri anlık olarak izleyebilmenize imkan veriyor. Aşağıdaki sınıflar eklenmiştir.

  1. java.lang.ProcessHandle
  2. java.lang.ProcessHandle.Info
  • Değiştirilemez Collection(Kısa yöntem)

Önceden değiştirilemez collection oluşturmak için aşağıdaki gibi bir kod bloğu yazmamız gerekiyordu.
Java 9 ile birlikte bunu kolayca tek satırda yapabiliyoruz.

Set set = new HashSet();

set.add(1933);

set.add(2019);

set = Collections.unmodifiableSet(set);
Set ints = Set.of(1933,2019);
  • Optional Api’daki Yenilikler

Stream: Java 8’de stream ederken optional ile değer kontrolü yapmamız gerekmekteydi. Şimdi ise otomatik olarak bu kontrolü yapar hale gelmiştir.

List strings = streamOptional().filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
List<String> newStrings = s).flatMap(Optional::stream).collect(Collectors.toList()); <--Yeni
  • Stream API’daki yenilikler

Stream için birkaç yeni ve kullanışlı metot eklendi

Özellikle buradaki iki metot çok önemli, bunlardan birisi takeWhile() ve bir diğeri ise dropWhile() metotlarıdır.

TakeWhile(): Kural yanlış olana kadar gelen değerleri stream eder.

DropWhile(): Kural yanlış olana kadar gelen değerleri düşürecektir.

Stream.of(2, 4, 6, 8, 9, 10, 12)

    .takeWhile(n -> n % 2 == 0)

    .forEach(System.out::println);

// prints out:

// 2

// 4

// 6

// 8
Stream.of(2, 4, 6, 8, 9, 10, 12)
    .dropWhile(n -> n % 2 == 0)
    .forEach(System.out::println);
// prints out:
// 9
// 10
// 12
    

Java 9 daki tüm yeniliklere ulaşmak için aşağıda paylaştığım linki kullanabilirsiniz.

JAVA 9 Tüm Yenilikler

JAVA 10 ve YENİLİKLERİ

Sanırım temel özelliklerinden bahsederken en çarpıcı değişiklik Local-variable type inference dediğimiz olay. Artık değişkenleri aşağıdaki gibi tanımlayabileceğiz.

var list = new ArrayList();
var stream = list.stream();

Bu değişiklik C geçmişi olan veya Scala geliştiren geliştiriciler için yabancı gelmeyecektir. Çoğumuzun hoşuna gitmeyeceğini düşünüyorum, çünkü geliştirme esnasında tipin ne olduğu belli olmaması kodu anlamayı ve okumasını zorlaştırdığını düşünenlerdenim. Hatta değişken tipleri yüzüden hataların kod aralarında saklanabileceğini düşünüyorum.

ArrayList>> obj = F   gibi uzun bir satır yerine;
obj = FactoryMethod(); yazıp geçebiliriz.

  • Garbage collector

Java 10 ile Garbage collector’e eklenen yeni özelliklerle temizleme işleri daha da güçleniyor.

  • Container Awareness

Bir diğer güzel gelişme ise container tarafında oldu, önceden container içerisinde JVM ile çalışan uygulamalarda cpu ve memory tarafında performans problemleri yaşanabiliyordu, her ne kadar containera cpu ve memory limiti koysanız da JVM container içerisinde çalıştığını farketmediğinden bu ayarları yok sayıyordu. Java 10 ile birlikte JVM, container içerisinde çalışıp çalışmadığını anlayabilecek özelliklere sahip oldu, böylece JVM, containera koyulan cpu ve ram limitlerini algılayıp, belirtilen sınırları aşamayacak.

  • Yeni Apiler

Java 10, değiştirilemeyen koleksiyonların oluşturulmasını daha iyi etkinleştirmek için yeni API’leri sunacaktır. CopyOf, Set.copyOf ve Map.copyOf yöntemleri, varolan örneklerden yeni koleksiyon örnekleri oluşturur. Aktarım paketindeki Collector sınıfına, yeni bir yöntem olan DeğiştirilemezDeğiştir, Değiştirilemeyen ve DeğiştirilemeyenMod eklenmiş ve bir Akışın öğelerinin değiştirilemez bir koleksiyona toplanmasına olanak sağlanmıştır.

  • Diğer yenilikler
    • JDK reposundaki dağınıklığın toparlanması
    • Garbage-Collector arayüzü
    • Paralel Full GC for G1
    • Application Class-Data Sharing
    • Thread-Local handshake
    • javah kaldırılması
    • Java dilinde yazılmış deneysel JIT-Compiler

Java 10 daki tüm yeniliklere ulaşmak için aşağıda paylaştığım linki kullanabilirsiniz.

JAVA 10 Tüm Değişiklikler

JAVA 11 ve YENİLİKLERİ

Yeni sürümün öncesinde yayınlanan 9 ve 10 sürümlerinden farkı, tıpkı Java 8 gibi uzun güncelleme desteği olan bir sürüm olmasıdır (LTS, “Long term support”).JDK 11 de yenilikler şu şekilde:

  • 181: Nest-Based Access Control
  • 309: Dynamic Class-File Constants
  • 315: Improve Aarch64 Intrinsics
  • 318: Epsilon: A No-Op Garbage Collector
  • 320: Remove the Java EE and CORBA Modules
  • 321: HTTP Client (Standard)
  • 323: Local-Variable Syntax for Lambda Parameters
  • 324: Key Agreement with Curve25519 and Curve448
  • 327: Unicode 10
  • 328: Flight Recorder
  • 329: ChaCha20 and Poly1305 Cryptographic Algorithms
  • 330: Launch Single-File Source-Code Programs
  • 331: Low-Overhead Heap Profiling
  • 332: Transport Layer Security (TLS) 1.3
  • 333: ZGC: A Scalable Low-Latency Garbage Collector
  • 335: Deprecate the Nashorn JavaScript Engine
  • 336: Deprecate the Pack200 Tools and API

Bunların çoğu yazılım geliştiren (kod yazan) birini doğrudan ilgilendiren konular değil. Bir yazılımcı için önemli olan değişikliker kalın harflerle belirtiliyor.  Aralarında en fazla göze çarpan özelliklerden biri, Java 10 ile birlikte tanıtılan ve C#’dan da tanıdığımız türsüz yerel değişkenlerin (local variable) Lambda ifadelerinde de kullanılabiliyor olması.

Bir başka dikkat çeken özellik ise tek kaynak kod dosyalarının (*.java) derlemeden (*.class, “compile”) direkt yürütülebiliyor olması. 

Java 11 ile birlikte Oracle yeni lisans stratejisini uygulamaya geçirdi. Yazımın başında da belirttiğim gibi son LTS sürümü olan Java 8’in ücretsiz güncelleme desteği Ocak 2019 itibariyle bitti. Java 11 Oracle JDK’si ise sadece geliştirme sürecinde ücretsiz olacak ve prodüksiyona geçildiği takdirde güncelleme desteği ücretli hale gelecek. Bunun için de Oracle ile bir destek anlaşması imzalamak gerekiyor. Java 11 sürümü için destek ise 3 yıl boyunca sürecek. Bu da demek oluyor ki, bir sonraki LTS sürümü 2021 yılında yayınlanacak.

LTS olmayan sürümler (9, 10, 12, …) için destek ise bir sonraki sürüm yayınlandığında bitiyor. Yani Java 9 desteği örneğin Java 10 ile birlikte sona erdi.

Java 11 daki tüm yeniliklere ulaşmak için aşağıda paylaştığım linki kullanabilirsiniz.

JAVA 11 Tüm Yenilikler

JAVA 12 ve YENİLİKLERİ

  • Switch-Case ifadesinde yenilik

Java 12 den önce nasıldı sonra nasıl şeklinde inceleyecek olursak aşağıdaki kod blogları size değişiklik hakkında net bir bilgi verecektir.

Java 12’den önce

int numberOfLetters;

switch (fruit) {
case PEAR:
    numberOfLetters = 4;
    break;
case APPLE:
case GRAPE:
case MANGO:
    numberOfLetters = 5;
    break;
case ORANGE:
case PAPAYA:
    numberOfLetters = 6;
    break;
default:
    throw new IllegalStateException (“Wut” + fruit);
}

Java 12 den sonra

int numberOfLetters = switch (fruit) {
    case PEAR -> 4;
    case APPLE, MANGO, GRAPE -> 5;
    case ORANGE, PAPAYA -> 6;
}
  • Yeni String metotları

1. indent(int n)

2. transform(Function f)

3. Optional describeConstable()

  • Kompakt Sayı Biçimlendirme

Java 12 daki tüm yeniliklere ulaşmak için aşağıda paylaştığım linki kullanabilirsiniz.

JAVA 12 Tüm Yenilikleri

JAVA 13 ve YENİLİKLERİ

Bazı yenilikler aşağıda listelenmiştir.

  • Text blokları- JEP 355
  • Text blokları için yeni string metotlar – 
  •  Java 12 de gelen yeni switch case daha fazla genişletildi.- JEP 354
  • Socket API ye yeni özellikler eklendi JEP 353
  • Dinamik CDS Arşiv JEP 350
  • ZGC:Kullanılmayan bellek kaldırıldı JEP 351
  • FileSystems.newFileSystem()  metodu eklendi
  • Unicode 12.1 desteği geldi
  • DOM ve SAX namespace desteği eklendi.

İşimize yarayabilecek olan bir iki tanesini açıklamaya çalıştım.

1.Text Blokları

2. Yeni FileSystems.newFileSystem() metot

FileSystems sınıfına üç yeni yöntem eklenmiştir.

  1. newFileSystem(Path)
  2. newFileSystem(Path, Map)
  3. newFileSystem(Path, Map, ClassLoader)

Java 13 deki tüm yeniliklere ulaşmak için aşağıda paylaştığım linki kullanabilirsiniz.

JAVA 13 Tüm Yenilikleri