Java 7 - Melih Hilmi Uludağ

advertisement
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
Download