(TR) var ve Java 10 hakkında

Oracle firması özellikle Java 9’dan sonra hızlı bir sürüm çıkartma sürecine girdi. Java 9’un ardından Java 10 geldi ve sonrasında Java 11. Oracle’ın her 6 ayda bir yeni bir Java sürümü çıkartacağını duyurması, hem sevindirici hem de bir o kadarda iddialı bir çıkış olmuştur.  [1] .

Bu yazıdaki amacım sizlere Java 10 ile birlikte gelen “var” özelliğini tanıtmaktır. Burada anlattığım kod örneklerinin hepsini https://github.com/altuga/varVeJava10 adresinden indirebilirsiniz.

Hemen başlayalım, işte ilk kod örneğimiz;

var veriler = new HashMap<User, List<String>>();
veriler.put(new User("Ali", "Ok"), Arrays.asList("a","b"));

İlk gözlemim var ifadesinin okumayı kolaylaştırdığı yönündedir. Yukarıdaki ifade mi daha kolay yoksa aşağıdaki mi ?

HashMap<User, List<String>> userListHashMap =  new HashMap<User, List<String>>();
userListHashMap.put(new User("Ali", "Ok"), Arrays.asList("a","b"));

Kod karmaşasını dindirdiği ortadadır. Yazılımcıların yazmaktan daha çok kod okumaya zaman harcadığı göz önüne tutulursa,  “var” özelliğinin sağladığı sadelik faydalıdır. Örneklerimizi çoğaltalım;

Map<String, List<String>> countryToCity = new HashMap<>();
// ...
for (Map.Entry<String, List<String>> citiesInCountry : countryToCity.entrySet()) {
    List<String> cities = citiesInCountry.getValue();
    // ...
}

Yukarıdaki kod bloğunu “var” ifadesi kullanarak baştan yazalım

 var countryToCity = new HashMap<String, List<String>>();
// ...
for (var citiesInCountry : countryToCity.entrySet()) {
    var cities = citiesInCountry.getValue();
    // ...
}

Kesinlikle daha okunaklı bir kod elde ettik. Java 10 ile birlikte  gelen “var” özelliğini maalesef henüz Lambda ifadeleri ile birlikte kullanamıyoruz.  Aşağıda kod satırı derlenmeyecektir.

var  userComparator2 = (user1, user2)  -> user1.toString().compareTo(user2.toString());

Gelelim kalıtım ve “var” özelliğinin ilişkisine, örneğin aşağıdaki gibi bir yapı kurmuş olalım.

Aradaki kalıtım ilişkisinden dolayı; her Bisikler bir Vasıta’dır ve her Araba bir Vasıta’dır diyebiliyoruz. Böyle bir durumda aşağıdaki kod parçası sizce derlenir mi ?

var araba = new Araba();
araba = new Vasita();

“var” tipinde olan araba değişkeni Araba nesnesine bağlanıyor ve sonra aynı değişkeni (var araba) Vasita nesnesine bağlamaya çalışıyoruz ?  Cevap derlenmez çünkü Liskov prensibine göre daha gelişmiş bir tipe ait referans (Araba), daha ilkel bir tipteki bir nesneyi (Vasita) taşıyamaz çünkü tutarsızlıklar ortaya çıkabilir. Peki aşağıdaki kod parçası derlenir mi ?

var vasita = new Vasita();
vasita = new Bisiklet();

Bu örnekte ise bir yanlışlık yoktur çünkü vasita isimli değişkene ilk olarak Vasita nesnesi bağlanmıştır. Bu yüzden “var vasita” , Vasita sınıf tipine bürünmüştür. Bu durumda Vasita tipinde ki bir değişkene Bisiklet nesnesi bağlanabilir mi ?

“var” özelliğini global değişkenlerde ve method imzalarında kullanamıyoruz, “var” özelliğini sadece lokal değişkenlerde kullanabiliyoruz. Belki ilerleyen sürümlerde bu destek gelebilir.

// derleme hatası
private void trim(var value) { 
  // ...
}

“var” ifadesinin hiç mi olumsuz tarafı yok ? “var”ifadesinin her yerde kullanmanın kod okumada getirdiği sıkıntılar da olmaktadır. Aşağıdaki kod satırını hemen bakalım;

var countryToCity2 = getCitiesJava10();

getCitiesJava10() metodu ne geri dönmektedir ? Bu ilk bakışta net bir biçimde görünmüyor.

Aklınıza şöyle bir soru gelebilir : Java 10 ile birlikte gelen var özelliği  çalışma zamanında ki performansı olumsuz etkiler mi ?

Örneğin Javascript dilinde ki “var” ifadesini kullanarak değişkenlerin tiplerini çalışma anıda belirleyebiliriz. Elbette bu seçim performans sıkıntısını beraberinde getirmektedir ve fakat Javascript motorlarına yapılan inanılmaz yatırım sayesinde bu olumsuzluğun performans üzerindeki etkisi asgari derecededir [2].

Java 10 ile birlikte gelen var özelliği tamamen derleme anında devreye girmektedir bu yüzden çalışma anında performansa olumsuz bir etkisi söz konusu düzeydedir.

[1] – https://www.forbes.com/sites/oracle/2018/03/20/what-java-10-and-javas-new-6-month-release-cadence-mean-for-developers/#390a7623271a

[2] Java Magazine JanFeb 2018 – Decline of Dynamic Typing – Andrew Binstock

 

No Comments

Post a Comment

Comment
Name
Email
Website