JAVA 7 & JAVA 8 YENILIKLERI VE ÖZELLIKLERI MELIH HILMI ULUDAĞ 22.07.2014 Java SE 6 çıkış tarihi 11 Aralık 2006. Yaklaşık 4,5 yıl farkla Java SE 7 yayınlandı. Bu süreçte Java SE 6 nın 26 kadar güncellemesi verilse de, Java tutkunları JDK 7 için sabırsızlanıyorlardı. JAVA 7 ILE GELEN YENILIKLER Genel olarak, Performans güçlendirilmiş, kararlılık ve güvenirlilik sağlanmış. Daha zengin internet uygulamaları için Java Eklentisine yönelik iyileştirmeler yapılmış. Java kodu yazma ve optimize etme üzerine dile yenilikler ve iyileştirmeler getirilmiş. Java dışı dilleri daha etkin desteklemek için Java Virtual Machine iyileştirmeleri sağlanmıştır. t1 …. t2 Problem …. JAVA 7’ nin en iyi yanı, t3 …. t4 Problemi daha akıllı bir biçimde alt problemlere parçalayacak ve bu alt problemlerin çözümüne götüren iş parçaları arasında düşük eş zamanlama (synchronization) maliyeti olan yapılara ihtiyacımız var. Nihayet Java 7 Böl/Katıl çatısı (Fork/Join Framework) olarak adlandırılan bir çözüm sunarak çok çekirdekli sistemlerde uygulama geliştirmeyi nispeten kolaylaştırdı. ÖNE ÇIKAN ÖZELLİKLER İlkel tiplerden tam sayıların değerlerini tutabildiğimiz byte, short, int ve long tipleri artık binary şekilde tanımlayabiliyoruz. Yani sayıların başlarına “0b” ya da “0B” yazabiliyoruz. B’nin burada küçük büyük harf olması herhangi bir şeyi değiştirmiyor. Sayısal tipleri artık basamaklar arasına alt çizgi yazarak tanımlayabiliyoruz. Yalnız ondalıklı sayılarda noktadan hemen önce ya da sonra, long tiplerde de ‘L’ harfinden önce alt çizgi kullanamıyoruz. Bunun yanında sayısal değerin en başına ya da en sonuna da alt çizgi koyamıyoruz. Alt çizgi kullanımı bize okunurluk sağlıyor. Java’nın sayılı eksikliklerinden görülen bu durum giderilmiş. Artık String değişkenleri switch komutu ile kıyaslayabiliyoruz. 6.0 Generic tipler kullanırken yazdığımız <> işaretleri arasındaki objeler, yaratılan instance’larda da yine aynı şekilde yazılıyordu. Bu da sadece tanımda bile bir sürü karmaşaya yol açıyordu. Java 7 ile beraber new ile yarattığımız instance’larda <> açıp kapatmak yeterli olacak. Varargs kullanırken parametre sayısı belli olmayan değişkenleri metot içerisinde dizi gibi kullanabiliyorduk. Yalnız çalışma anında nesnelerin birbirlerine cast edilememesi (ClassCastException) gibi hatalarla karşılaşıyorduk. Artık derleyici gelişmiş uyarı ve hata mesajları veriyor. Bilindiği üzere Try-Catch ile Hata java7 öncesi; try {…………} catch (NumberFormatException nfe) {…………} catch (XException xe) {…………} . . . java7'de ise; try {…………} catch (NumberFormatException nfe | XException xe | …) {…………} yakalamada birden fazla hatayı Catch de karşılamak için hep yeniden blok açılırdı. Artık « I » Operatörü ile birden fazla hata nesnesini tek seferde yazmak mümkün hale geldi. DİĞER ÖZELLİKLER Graphics2D java.lang.Object java.awt.Graphics java.awt.Graphics2D Graphics Graphics java.lang.Object java.awt.Graphics Graphics2D iki boyutlu bir grafik, metin ve görüntüleme yetenekleri ile ilgili 2D Java API parçasıdır. Eski Graphics sınıfının aksine, Graphics2D koordinat dönüşümlerini destekler. Ayrıca geometri, renk ve metin mizanpajı Graphics2D üzerinde daha iyi kontrol sağlar. vs Garbage Collector yapısı Garbage-First Collector yapısı Garbage-First Collector JDK7 nin 4.versiyonunda dahil olmuştur. GC1 in çoklu işlemcili bilgisayarlar (sunucu bilgisayar) için tasarlandığını söylemek gerekir. GC ye göre yetenekleri ve performansı arttırılmış yapıya sahiptir. Serial GC aynı anda tek thread(iplik) çalışabilir, aynı anda birden fazla thread çalışan GC sistemine ise Parallel GC adı verilmektedir . GC1 i GC den ayıran en belirleyici özellik Seri ve Paralel çalışma biçiminin daha başarılı olmasıdır. JDK 7u4 ile birlikte G1 (Garbage First) olarak adlandırılan yeni bir çöp toplayıcısı geldi. Uzun dönemde, G1’in Java platformunun tek çöp toplayıcısı olması hedeflenmektedir. JSM’nin en zayıf halkası çöp toplayıcıdır. Çöp toplama sırasında tüm uygulamanın iş parçalarının durdurulduğu, "tüm dünyanın durduğu" (stop-the-world) bir evre vardır. Bu evre boyunca uygulama hiçbir iş yapmaz. Ne yazık ki çöp toplayıcı algoritmaları Heap boyutuna göre ölçeklenebilir değildir. Heap boyutu arttıkça bu süre de hızla artmaktadır. Örneğin 64GB heap boyutu olan bir JSM’de bu süre bir dakikayı aşabilir. G1 bu süre için bir sınır tanımlamamıza olanak sağlıyor. Paket yapısında yenilik sağlanmış. Bu yapı jar yapısını daha düzgün hale getirdi. Versiyon desteğini, aktif erişimi(reflective), dağıtım formatını(Java Module) bize sağlayacak. Dinamik yükleme modülü getirildi. Bu sayede Sistemin başlama süresi kısaltıldı. Otamatik Get() ve Set() methodları oluşturulacak. Problemler çözüldü. İyileştirmeler yapıldı. Joda Time Library e geçildi. Not: Joda Time Library harici olarak indirilip sisteme ekleniyor. Joda Time Library: dayOfYear, hourOfDay gibi basit sahalar ile önemli tarihsel bilgileri hızlıca elde etmemizi sağlarken sunduğu hizmet sınıfları ile karmaşık tarih işlemlerini kolayca yapabilmemize olanak verir. Yaygın olarak kullanılan kitaplık şu an için (sürüm 2.0) 8 takvim sistemini desteklemektedir. Desktop uygulamaları için kullanılan swing kütüphanesi yenilenmiş. Swing kütüphanesi kullanarak daha görsel ve göze hoş gelen uygulamalar yazılabilecek. Bean binding özelliği iyileştirilmiş. Hatırlatma: Java Uzantıları .xml ya da .properties olan bu dosyalarda tutulan veriler isim ve isme karşılık gelen değerler şeklinde tutulurlardı. Projelerimizde ayar yapacağımız zaman bu dosyaları gömerdik sisteme. Java 5.0 ile birlikte dile eklenen Annotation kavramı ile artık ayar dosyalarından kurtulduk. Not: Annotation değişkenleri olarak sadece primitive tipleri, String veEnum tipleri ve tek boyutlu dizileri kullanabiliyoruz. Dizi elemanlarının tipleri de yine sadece ilkel tip, String ya da enum olabiliyor Java 7 de ise, Annotation desteği genişliyor. Tür tanımlamada, ifadelerde ve diğer birçok elementde annotation daha çok kullanılacak. Derleyici ve statik analiz araçları için kodu çalışma zamanında doğrulayacak annotationlar yazmaya olanak vericek. Sonuç olarak, JDK 7 ile sadece Java diline eklemeler yapılmamış. Java virtual machine(JVM) de bir oldukça iyileştirilmeler yapılmış. Örneğin hello world yazıp çalıştırdığımızda println çıktısını daha çabuk görebileceğiz. Çünkü Javanın çekirdeğindeki sınıf yükleme(class loader) kısmı oldukça iyileştirilmiş. Java dilinin yetenekleri arttırılmış ve JVM; pyhthon, matlab vs. gibi dinamik dilleri destekler hale geldi. JDK 7 de gelmesi planlanan bir çok özellik JDK 8 e aktarıldı. JAVA 8 ILE GELEN YENILIKLER Genel olarak, Lamda İfadeleri ve Sanal Genişletme Yöntemleri Java SE 8'in öne çıkan özelliği, Lamda ifadelerinin uygulanması ve Java programlama dili ve platformunu destekleyen yönleridir. Tarih ve Saat API'si Bu yeni API, geliştiricilerin tarih ve saati daha doğal, net ve anlaşılması kolay şekilde ele almasına izin vermektedir. Nashhorn JavaScript Motoru JavaScript motorunun hafif ve yüksek performanslı yeni bir uygulaması JDK'ya entegre edilmiştir ve mevcut API'ler yoluyla Java uygulamaları tarafından kullanılabilir. İyileştirilmiş Güvenlik Çağırana duyarlı yöntemlerinin mevcut elle yönetilen listesini, bu gibi yöntemleri doğru şekilde tanımlayan bir mekanizmayla değiştirir ve çağıranlarının hatasız şekilde keşfedilmesini sağlar. Windows 8 ‘i , Windows7 ve Vista dan ayıran küçük fark: Metro Kullanıcı Arabirimi. Yani, Microsoft, Başlat ekranındaki eklentileri desteklemediğinden, Java Başlat ekranında çalışmayacaktır. Java'yı çalıştırmak için Masaüstü ekranına geçmeniz gerekir. Java 8 ile birlikte gelen Lambda ifadeleri ise fonksiyonel programlama yapmamıza olanak sağlıyor. Lambda ifadeleri sayesinde fonksiyonlar artık dilin birinci sınıf vatandaşı olarak işlem görecek. Fonksiyon tipinden bir değişken tanımlayabilecek ve fonksiyona parametre olarak başka bir fonksiyonu geçirebileceğiz. Lambda Expressions Buradaki temel amaç, bir metoda bir obje yerine daha fazlasını vermek… Şimdiye kadar J8 öncesinde, callback classları yazarak bu tip işlemleri yönetiyorduk. Bu da gereksiz yere uzun kodlar yazma gerekliliğini beraberinde getiriyordu. J8 deki Labmda sayesinde, 5,6 satırda yazdığımız kodları tek bir satırda yazabileceğiz. Bir örnek üzerinden açıklayım, Üstelik Java 8 ile gelen yeniliklerin bir kısmından kodda basit değişiklikler yaparak yararlanmak mümkün olacaktır. Örneğin, Java 8'de Arrays yardımcı sınıfına, diziler üzerinde paralel sıralama yapmamızı sağlayan parallelSort() metodu eklenmiştir. Bu yeteneği kullanmak için tek yapmamız gereken,Arrays.sort() çağrısını Arrays.parallelSort() çağrısı ile değiştirmektir. Paralel sıralamada Java 7 ile gelen Böl/Katıl çatısı kullanılmıştır. Java 8 ile birlikte sadece diziler üzerinde değil Collection API içinde yer alan kaplar üzerinde de paralel işler çalıştırmak mümkün olabilmektedir. Java 7 ile birlikte çok uzun bir süre sonra Java Sanal Makinası (JSM) yeni bir bytecode ile tanıştı: invokedynamic. Her ne kadar yeni bir komutla tanışmış olsak da henüz Java 7'de derlendiğinde invokedynamic kodu ürettirecek herhangi bir Java ifadesi bulunmuyor. Java 8'de ise fonksiyonel programlama ve arayüz metot eklentileri (=Method Extensions) içeren kodlar derlendiklerinde invokedynamic kodu içerebilecek invokedynamic ve JSM’nin yapısındaki yenilikler Java programlama dili dışındaki dillerin, JSM üzerinde yüksek başarımla çalışmasına olanak sağlamaktadır. Java platformu çok dilli bir platforma doğru evriliyor. Bunun ilk uygulaması Java 8 ile birlikte gelen yeni Javascript motoru Nashorn olacaktır. Platformdaki bu yenilikler sayesinde Javascript kodlarının çok hızlı çalıştığına tanık olacaksınız. Java 7 bunun altyapısını oluşturdu. Java 8 ise ilk uygulamasını bize sunuyor. Java 8’de çöp toplama ile ilgili dikkate değer tek gelişme Kalıcı Alan (=Perm(anent)Gen(eration)) olarak adlandırılan alanın genel Heap alanına eklemlenmesidir. Özellikle web uygulamalarında sık yapılan güncellemelerden kaynaklanan bu alanının dolmasına nedeni ile aldığımız taşma hatası ile şimdi daha seyrek karşılaşmak mümkün oldu. Sonuç olarak, Java platformu aynı .Net platformu gibi modüler değildir. Bir projede kullandığımız iki ayrı kütüphanenin, ortak bir kütüphanenin farklı sürümlerini kullanması durumunda, yürütme zamanında sınıf yükleyici ilk önce hangi sınıfı yüklemiş ise o sınıf kullanılacaktır. Sınıf yükleyici aynı sınıfın farklı sürümlerini yüklemesi ve yönetmesi mümkün değildir.Bu problemi farklı yöntemlerle çözmek mümkün olsa da projeye geliştirme açısından zorluk katıyor.Uzun süredir beklediğimiz modülerlik çözümü, Jigsaw projesi ile platforma kazandırılması amaçlansa da Java 8’e yetiştirilemeyeceği anlaşıldığı için çıkartılmıştı. Java 9’da bu problemin çözülmesini umuyoruz. Beni dinlediğiniz için Teşekkür Ederim. Melih Hilmi ULUDAĞ Kaynaklar: http://www.java.com/tr/download/faq/release_changes.xml http://docs.oracle.com/javase/7/docs/ http://www.eclipse.org/jdt/ui/r3_8/Java7news/whats-new-java-7.html https://www.linkedin.com/today/post/article/20140409042429-11833655-java-8-ilegelen-yenilikler http://emreesirik.com/java-java-7-cikiyor-java-7-yeni-ozellikler.html