"var" keyword in Java10

13 views
Skip to first unread message

Afsin Buyuksarac

unread,
Mar 15, 2020, 7:50:41 PM3/15/20
to Unname
Akif Hocam hatirlar, microJ'i Object microJ'e donusturme esnasinda "var" keyword ile alakali bir onermem vardi. Javascript'te kullaniyorduk neden yeni dilde olmasindi. 

Mantigi cok basitti, reflection'a gore aslinda sol taraftaki tanimladigimiz degiskenin tipi cok da muhim dedilgi. Instance alip object'e donusturecegimiz zaman sag tarafta cagirilan method/constructor ne varsa onlarin dondurdugu tip onemliydi. 

Bunu 2018 Java farketmis olacak ki artik kullanilabilir hale geldi. 


Yani ne varki bunda zaten biliyorduk diyebilirsiniz. Isin ozunde degisken tanimi yapilirken ayni degiskenin birden cok tip ile kullanim ozgurlugu tanimasi benim savimdi. 

var x = 2;
x = "Example";
x = new ObjectType();

gibi. 

Selamlar, 

--Afsin

Akif Eyler

unread,
Mar 16, 2020, 1:06:03 AM3/16/20
to java...@googlegroups.com
Elbette hatırlarım Afşın, microJ için güzel fikirdi

Sanırım Java'da bu fikir tam uygulanamaz  -- baksana ne diyor:

No, This Is Not JavaScript
This does not change Java’s commitment to static typing


__Akif Eyler__



On Mon, Mar 16, 2020 at 2:50 

Afsin Buyuksarac

unread,
Mar 16, 2020, 2:57:08 PM3/16/20
to Unname
Evet hocam, Java'da bircok yapilan sey compiler seviyesinde yine 1.4 compiler'a uyarlaniyor bununla beraber bu yeniliklerin cogu sadece kod yazmayi kolaylastirmak icin yapiliyor.

Yine de guzel bir hatirlamaydi :)

Selamlar, 

--Afsin

--
Java and open software -- 2004
---
Bu iletiyi Google Grupları'ndaki "Java & OSS" grubuna abone olduğunuz için aldınız.
Bu grubun aboneliğinden çıkmak ve bu gruptan artık e-posta almamak için java-oss+u...@googlegroups.com adresine e-posta gönderin.
Bu tartışmayı web'de görüntülemek için https://groups.google.com/d/msgid/java-oss/CAC5h89wKKQaokSvzwRgUXfP_WFaAce9BpAsAySBBjaSHckkgOg%40mail.gmail.com adresini ziyaret edin.

Serkan Yıldırım

unread,
Mar 21, 2020, 12:21:06 PM3/21/20
to java...@googlegroups.com
Selamlar,

Bu arada şunu belirtmek isterim. Scala'da yıllardır var ve val keywordleri mutable ve immutable nesneler tanımlamak için kullanılmaktadır.


Java 8 ve daha sonra gelen dile özgü değişiklikler (Lambda, var ...) genel olarak functional programming destekleyen dillerde zaten bulunmaktadır. Scala hem object oriented hem de functional programming ilkelerini barındıran bir dildir. Bu nedenle var ve val kullanımı vardır. Ama Haskell gibi pure functional olan dillerde mutable değişken tanımı yoktur. Tanımladığınız değişkenler her zaman immutable'dir (değişmez). Enteresan bir tabir olduğunun farkındayım, değişken ve değişmezlik :) değişken tabiri programlamanın tarihinden beri kullanıldığı için alışkanlık diyelim :) Functional programming'de variable kavramı yerine value kavramı kullanılmaktadır.




--

Tuncay Başkan

unread,
Mar 25, 2020, 1:25:37 AM3/25/20
to Java-OSS
C# dilinde 3.0 versiyonundan beri var keyword olarak var. Java'dan farklı olarak sadece syntactic sugar değil, gerekli de. 3.0 ile ortaya çıkan anonymous object/type özelliğini desteklemek için eklenmiş bir keyword.

var anonymousType = new {
  Id = 2,
  Name = "Test"
};

şeklinde anonymous object yaratabiliyoruz. Java'daki Map, .NET dünyasındaki Dictionary'den farklı olarak derleyicinin statik tip kontrol desteğini (Türkçe yazınca garip geldi gerçekten; static type checking) kullanmaya devam edebiliyoruz.

Syntactic sugar olarak da mantıklı bir özellik bence;

Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();

yerine 

var dict = new Dictionary<string, List<string>>();

şeklinde tipin explicit olarak belli olduğu yerlerde yazımı ve okumayı kolaylaştırıyor. 

Ancak her özellik gibi abuse edilebiliyor. Bu durumda da kod okunmaz hale geliyor. Kod, genelde bir kere yazılıp 50 defa okunduğu için readability'nin çok önemli olduğunu düşünüyorum.

Uzun süredir Java ile ilgilenmemiştim. Bir proje için tekrar Java ile uğraştım bir süre. Maile konu olan var/val kavramlarını yani immutable/mutable değişken desteğini build sürecinde sağlayan Lombok isimli bir library var. DTO için getter/setter, hashCode, toString vs gibi boilerplate kod yazılmasına da gerek bırakmayan @Data gibi anatasyon desteği de var.

Java dilinde maalesef hala olmayan extension metotları, operator overloading, vs gibi özellikler için de Manifold projesi dikkatimi çekti.

Java, library/ekosistem olarak çok büyük fakat dil olarak çok yavaş ilerliyor. Çok basit, ancak işlevsel bir özellik olan string interpolation daha yeni geldi mesela...

/tb.

Akif Eyler

unread,
Mar 25, 2020, 4:13:18 AM3/25/20
to java...@googlegroups.com
Eğitimci olarak, yazdığınız satırlarda öğrencilere aktaracağım hikmetler arıyorum

Kod, genelde bir kere yazılıp 50 defa okunduğu için readability'nin çok önemli olduğunu düşünüyorum.

Tucay'dan az önce gelen bu satır gibi :)

 
Çok basit, ancak işlevsel bir özellik olan string interpolation [Java'ya] daha yeni geldi mesela...

Uygulamada yaygın kullanılıyor mu? Şu ikisinin kavram olarak ne farkı var?
someone + " was looking for " + something  
`${someone} was looking for ${something}`

Bana tamamen aynı görünüyor... ikinciyi yazmak daha zor değil mi?

Tuncay Başkan

unread,
Mar 25, 2020, 11:56:57 AM3/25/20
to Java-OSS
Uygulamada yaygın kullanılıyor mu? Şu ikisinin kavram olarak ne farkı var?
someone + " was looking for " + something  
`${someone} was looking for ${something}`

Bana tamamen aynı görünüyor... ikinciyi yazmak daha zor değil mi?


Kısa ve 1-2 tane değişken olduğu durumda concat (+) veya formatting (String.format) daha basit ve kullanışlı olsa da 1-2 taneden fazla ve içinde noktalama işaretleri olan stringler için yazması ve okuması daha basit hale geliyor.

var msg = "'" + userName"' kullanıcı kodu ile '" + accountNo + "' hesabından " + tranId + " nolu işleminiz gerçekleşmiştir. (RefId={" + refId"})";

yerine;

var msg = $"'{userName}' kullanıcı kodu ile '{accountNo}' hesabından {tranId} nolu işleminiz gerçekleşmiştir. (RefId={refId})";

daha okunaklı. Yazması da daha kolay.

Şablon işlemleri için veya SQL sorgusu hazırlama gibi işlemler için ise biçilmiş kaftan (C#'ta verbatim string özelliği de var. @ karakter ile denote edildiğinde string multiline olabiliyor, escape karakterlerini kullanabiliyorsunuz, mesela tek '\' sıkıntı olmuyor).

var sql = $@"SELECT TranId, RequestJson
FROM TranHistory(NOLOCK)
WHERE TranDate='{today}'
AND BranchCode={branchCode}
AND (LastUpdateDate >= '{startTime}' AND LastUpdateDate < '{endTime}')
AND UserCode='{activeUserCode}'";

var sql = "SELECT TranId, RequestJson\n" +
"FROM TranHistory(NOLOCK)\n" + 
"WHERE TranDate='" + today + "'\n" +
"AND BranchCode={branchCode} \n" +
"AND (LastUpdateDate >= '" + startTime + "' AND LastUpdateDate < '" + endTime + "')\n" +
"AND UserCode='" + activeUserCode + "'";

İlk örneği yazması kolay, bir bakışta ne yapıtğını da anlaması bence daha kolay.

/tb.

Akif Eyler

unread,
Mar 26, 2020, 2:04:06 AM3/26/20
to java...@googlegroups.com
Teşekkürler Tuncay, SQL örneği yeterli :)




--
Java and open software -- 2004
---
Bu iletiyi Google Grupları'ndaki "Java & OSS" grubuna abone olduğunuz için aldınız.
Bu grubun aboneliğinden çıkmak ve bu gruptan artık e-posta almamak için java-oss+u...@googlegroups.com adresine e-posta gönderin.

Afsin Buyuksarac

unread,
Mar 27, 2020, 4:59:42 AM3/27/20
to Unname
Selam Tuncay, 

Bana gore tamamen aliskanlikla ilgili gibi geliyor bazi seyler. 
Interpolation olmamasi bana simdiye kadar cok elzem gorunmedi. 

Anonymous class declaration Java'nin kendine has tanimlama ozelligi ile cok onceki surumlerden beri desteklendigi icin "var" keyword'u ile yapilmasi gerekmiyordu. 

C type okunurluk backend dillerinde ortak haline getirilebilir. 

Ornegin Spring Framework'un cokca kullandigi Annotation kavramini kodun okunurlugunun oldurdugu kanaatindeyim. Mezun olan arkadaslar bir dil ogrenerek mezun oluyor ama yine de cogu CS programi sadece o dili ogretmek icin acilmiyor. Bu yuzden herseyini bilemiyor ogrenciler. 

Ornek vermek gerekirse, cogu is ilaninda "Spring Boot bilmek" bir zorunluluk halindeyken, bunu ezberleyip gelen bir aday, cok daha basit kavramlarin ne anlama geldiginden haberi bile olmuyor. Kapali kutu framework'ler yuzunden temel ihtiyaclari bilmiyor cogu aday. Eskiden telefon numaralarini akilda tutmak gerekiyordu, simdi mobil telefonlar sayesinde artik sadece isimle arama yapiyoruz. Acil durumlarda numara bilmedigimiz icin B planimiz yok. 

Bana gore, butun ozelliklerin olmasi sart degil dillerde. Hala daha Java 1.4'un 1.8'e gore daha iyi okunabildigi kanaatindeyim. 

Java8 ile gelen 

  • (p1, p2) -> System.out.println("Multiple parameters: " + p1 + ", " + p2);
Lambda function'lari dusunuyorum. Alisincaya kadar cok zorluk cektigimi soyleyebilirim. 
public interface MyComparator {

    public boolean compare(int a1, int a2);

}
MyComparator myComparator = (a1, a2) -> return a1 > a2;

Boolean result = myComparator.compare(2, 5);
Nasil bir kolaylik sagladi uzun bir mesele, ama okunurlugu hizlandirdi mi dersen goreceli derim. 

İlk örneği yazması kolay, bir bakışta ne yapıtğını da anlaması bence daha kolay.

Bence de. 

Ozetle, pseudocode bile ogreniyor olsalar, design patternleri, kodlamanin bakkal hesabini ve "indentation"i ogrenmeleri gerekiyor. 

Konu bitirme projesi ile acilmisti, Akif Hocam reflection'i iyi anlatan bir ornek yapmistik Mj4'te. Mj4 kodunun icerisinden Mj3 compileri'ini cagiran ve mj3 kodlarini derleyen bir ornekti. Sonrasinda hizimi alamayip SSS'nin FIDE'nin orneklerini de yapmistim. Simdi hatirladikca hala hosuma giden seyler oldugunu hatirliyorum. 

Bu arada, code efficiency icin de ufak bir oyun araci yazmak guzel olabilir. Bir fonksyonun, bir program parcasinin Big-O notation ile calisma zamanini ve gerektirdigi memory bilgisini ogretmek icin. Bunlari da cok onemsemiyoruz. 

Selamlar, 

--Afsin 

Afsin Buyuksarac

unread,
Apr 1, 2020, 4:51:33 PM4/1/20
to Unname
Hocam, 

Bizim satirlarda cikan/cikmayan hikmet bir kitapta yayimlanmis olabilir. 


Okumasi da bilgi edinmesi de guzel bir kitaba benziyor. 

--Afsin



--
Java and open software -- 2004
---
Bu iletiyi Google Grupları'ndaki "Java & OSS" grubuna abone olduğunuz için aldınız.
Bu grubun aboneliğinden çıkmak ve bu gruptan artık e-posta almamak için java-oss+u...@googlegroups.com adresine e-posta gönderin.

Akif Eyler

unread,
Apr 2, 2020, 12:23:16 AM4/2/20
to java...@googlegroups.com
Sağol Afşın, "hikmetli söz" derken tam bunu kastetmedim :)
  • "Behavior Is Easy, State Is Hard"
  • “Learn Java Idioms and Cache in Your Brain”
  • “Java Programming from a JVM Performance Perspective”
  • "Garbage Collection Is Your Friend"
  • “Java's Unspeakable Types”
  • "The Rebirth of Java"
  • “Do You Know What Time It Is?”

Mavi işaretli söz dışında hikmetli bir söz göremedim bu konu başlıklarında. 

Sizden gelen hikmetler kitapta okuyacağımdan çok daha değerli oluyor...

__Akif Eyler__



On Wed, Apr 1, 2020  Afsin Buyuksarac 
Hocam, 

Bizim satirlarda cikan/cikmayan hikmet bir kitapta yayimlanmis olabilir. 


Okumasi da bilgi edinmesi de guzel bir kitaba benziyor. 

--Afsin.



On Wed, Mar 25, 2020  Akif Eyler 
Eğitimci olarak, yazdığınız satırlarda öğrencilere aktaracağım hikmetler arıyorum...
 
Reply all
Reply to author
Forward
0 new messages