15 Ekim 2019 Salı

JAVA 8 ile Gelen Yenilikler

Java 7 den Java 8 ‘e oldukça keskin bir geçiş olduğunu gözlemlemekteyim. Imperative programming den functional programming e geçiş eski java developerların adaptasyonda zorluk çekecekleri bir durum olarak karşımıza çıkacaktır diye düşünüyorum. Java 8 ile ilgili tüm değişikliklerin hepsini olmasa da tespit ettiğim bir çok yeniliği burada not olarak ekleme ihtiyacı hissettim. Başlıca yenilikler;

1)    Java 7 de gelen array lerin multi threading çalıştırılabilmeleri, java nın çok çekirdekli işlemcilerde çalışmasını anlamlı kılıyordu. Ancak, java 8 de bu yetenek Collection lar üzerinde de uygulanabilir hale gelmiştir.(Bknz. Stream API implementation)
2)    Garbage collector ile ilgili olan “PermGenStack’ ten Heap’ e taşınmıştır.
3)    Java 8 öncesinde herhangi bir Interface sınıfında gövdeli(implement) metod yazmak mümkün değildi. Java 8 ile gelen default keyword ü ile artık Interface sınıflarda gövdeli metot yazmak mümkün. Spring Data API sinde, bu yenilik kullanılarak ORM yeteneklerinin daha da güzelleştiğini gözlemlemekteyiz.
4)    Lambda ifadelerini uygulayabilmek için, functional interface ler geldi. İçerisinde, tek bir abstract methodu olan ve birden fazla static ve default metodlar barındırabilen interface lere functional interface denir.
5)    Lamda expression lar geldi. Lamda expressionlarda daha az satır kod ile imperative programlamada yazdığımız kodları yazabilmekteyiz. Stream API içerisinde lambda expressionlar sıklıkla kullanılmaktadır.
6)    Imperative programming den , functional programming e geçildiğini gözlemliyoruz. Functional programming örneği olarak; “bana filtrelenmiş listeyi getir”, imperative ise ; “filtrelenmiş yeni liste nesnesi oluştur, liste içerisinde dön, her liste elemanının içeriği filtreye uygunsa yeni liste elemanına ekle, son eklenmiş listeyi getir, …” şeklinde örnek verilebilir.
7)    Methodlar “::” söz dizimi ile referans verilebilmektedir. Static methodlar class name ile, static olmayan methodlar ise instance objeleri ile referans verilebilmektedir.
Örnek;
testList.forEach(TestClass::staticMetod);
TestClass testClass=new TestClass();
testList.forEach(testClass::nonStaticMetod);
8)    Javascript kodlarının çok hızlı çalışmasını sağlayan, Nashorn javascript engine geldi.
9)    AtomicLong dan daha yüksek başarımlı sayaç işlemlerinin yapıldığı LongAdder objesi geldi. AtomicLong a gore daha fazla bellek kullanmaktadır.
10) Nesnelerin NullCheck işlemleri için “Optional” isimli özel bir utilityclass geldi.
Eylül 2019 itibari ile Open JDK da, Java SE 13 release olmasına rağmen Oracle Java SE Road map olarak, Java SE 8 sonrası sürümler için Long-term support(LTS) destek limitini 3 yıl olarak duyurdu(Duyuru:https://www.oracle.com/technetwork/java/java-se-support-roadmap.html). Tabii ki Non-LTS olarak çıkan diğer sürümlerde(9,10 ve 12. sürümlerde) ise premier olarak desteğinin olacağını ifade etmiştir. Aynı duyuruda Java 8 için Extended Support olarak Mart 2025 tarihi bulunmaktadır. Eğer Java 8 den üst sürümlere migrate düşünüyorsanız acele karar vermeyin derim. Embedded development geliştiren developer arkadaşlar, yukarıda bahsettiğim Java SE 8 yeniliklerinin dışında ME(Micro Edition) sürüm yeniliklerine de mutlaka bir göz atsınlar.
Java 8 yeniliklerinin detaylarını, JCP(Java Community Process - https://www.jcp.org) de yayınlanmış JSR(Java Specification Requests) ları “https://docs.oracle.com/javase/specs/jls/se8/html/index.html” linkinden okuyabilirsiniz. Oracle ‘ın yayınladığı diğer java sürüm specification larının tümünü ise “https://docs.oracle.com/javase/specs/” linkinde bulabilirsiniz.