Java 9 ile Gelen Yenilikler
Merhaba, bu yazımda Java 9 ile gelen yeniliklerden öne çıkmış birkaçından bahsetmek istiyorum.

Modüler sistem
Jigsaw(yapboz) projesi kapsamında hayatımıza giren bu yenilik ile projelerin erişim gereksinimleri ve sunduğu özellikleri net olan modüllerden oluşması hedeflenmektedir.
Bu sistemde kullanılan bir modül birbirleriyle ilişkili paketler(packages), kaynaklar(resources) ve kendisini açıklayan bir dosyadan(module-info.java) oluşmaktadır.
Bir modülün neler sunduğu ve nelere ihtiyaç duyduğu module-info.java ile tanımlanır. Modülün sundukları “exports”, modülün ihtiyaç duydukları ise “requires” keywordleri ile belirtilir. Örnek bir modül ile ilgili tanım aşağıdaki gibi yapılabilir:
module com.burak.simpleProject.model {
exports com.burak.simpleProject.model;
}
Bu modülü kullanacak diğer bir modül içinse tanım aşağıdaki gib olacaktır:
module com.burak.simpleProject.service {
requires transitive com.burak.simpleProject.model;
exports com.burak.simpleProject.service;
}
Baeldung’un ele aldığı yazıdan örnek vermek gerekirse modül yapısı ile aşağıdaki gibi proje oluşturulabilir:

Bu sistemin kazandıracağı birkaç konuya değinmek gerekirse:
- Hangi modülün ne sunduğunu ve neye ihtiyaç duyduğunu bilmemiz kod okunabilirliğini artıran bir durum.
- Kullandığımız JDK’ların binlerce class barındırdığını göz önünde bulundurursak, modüler yapı ile çok daha az yer kaplayan ve daha az kaynak kullanan JDK versiyonları ile uygulamalarımızı çalıştırabiliriz. Dolayısıyla hem elimizdeki cihazlardan daha fazla faydalanabileceğimiz gibi daha az kaynağa sahip cihazlarda da uygulamalarımız çalıştırabilir hale geleceğiz.
- Her modülün kendine ait bir kaynaklar(resources) birimi olduğu için projedeki tüm kaynakları tek bir noktadan yönetmekten çok daha avantajlı bir konumdayız.
- Farklı modüllere sahip bir projede herhangi bir modül üzerine geliştirme yapmak bu yapıyı kullanmayan projelere göre çok daha kolay olacaktır.
JShell

Java 9 ile gelmiş diğer bir yenilik ise JShell aracı. Kısaca ifade etmek gerekirse “hızlı bir şekilde değişkenler tanıyıp bu değişkenleri kullanarak methodlar yazabileceğimiz bir araç” olan JShell üzerine hazırladığım yazıyı şu adreste bulabilirsiniz: JShell Kullanımı.
Interface’lerde private method kullanımı
Java 9 ile birlikte interfaceler üzerinde birden fazla public method içerisinde kullandığımız veya public method dışında tutarak kod okunabilirliğini artırmak istediğimiz kod bloklarını private method olarak yazabiliyoruz.

Try-With-Resources kullanımındaki geliştirmeler
Java 7 ile tanıtılmış olan “try-with-resources” ile try bloğu içerisinde tanımlanan ve AutoClosable interfacei implement edilmiş tanımlamalar yapabilmekteyiz. Koda daha iyi okunabilirlik katan ve daha az kodla iyi kaynak kullanımı kazandıran bu özelliğe Java 9 ile tekrar bir local değişken tanımlama zorunluluğu ortadan kaldırılmış oldu.

Bahsedilmeye değer birkaç geliştirme
- Geliştirme sırasında sık sık bir List<Class> tanımı yapıp sonrasında bu listeye .add methodunu kullanarak çeşitli elemanlar eklediğimiz kod blokları, methodlar vs. yazmamız gerekiyor. Java 9 hem bunu kolaylaştıracak hem de farklı senaryolar kurmamızı sağlayabilecek birkaç yeniliklik getirmekte. List.of() ve Set.of() methodlarını kullanarak sabit(immutable) koleksiyonlar oluşturabilmekteyiz. Tanım sonrasında herhangi bir eleman eklemek istediğimizde “UnsupportedOperationException” hatası fırlatacak bu koleksiyonları aşağıdaki şekilde oluşturabilmekteyiz:
Set<String> setOfStrings = Set.of("foo", "bar");List<Integer> setOfIntegers = List.of(1, 2, 3);
- Java 9 ile birlikte Optional üzerine gelmiş olan stream methodu ile Optional olan objelerden bir Stream oluşturabilmekteyiz.
Optional<String> st1 = Optional.empty();
Optional<String> st2 = Optional.of("123");
List<Optional> list = List.of(st1, st2);
Stream<Optional> optionalStream = list.stream();
- Optional üzerine gelmiş bir diğer method is “ifPresentOrElse”. Bu method ile optional değişkenin değerinin boş olmaması durumunda bu değer ile çalışacak method ve değerin boş olması durumunda çalışacak Runnable tanımını vermekteyiz.
Optional.ifPresentOrElse(this::doSomething,this::alert);
Yazının başında da belirttiğim üzere Java 9 ile gelmiş yeniliklerden öne çıkmış birkaçından bahsettim. Önceki versiyon olan Java 8'den 3 yıldan fazla bir süre sonrasında çıkmış olduğu için en çok yenilik getirilen versiyonlardan biri (18.03.2014 – 21.07.2017). Bu yüzden yukarıda bahsedilmiş olanlar dışında da birçok yenilik bulunmakta.
Bu yazıyı hazırlarken kullandığım ve/veya faydalı olabilecek birkaç link bırakarak yazımı sonlandırıyorum, iyi okumalar.