1. sözdizimsel şeker

Programcılar, bazı karmaşık kodların veya mantığın birkaç satıra yazılarak kodun derli toplu ve okunabilir hale gelmesine bayılırlar. Ve bazen programlama dillerinin yaratıcıları bu konuda yardımcı olur.

Bir kısayol kullanmanıza (daha az kod yazmanıza) izin veren kaygan bir dil özelliğine sözdizimsel şeker denir . Ama dürüst olmak gerekirse, Java'da çok az var.

Java'nın yaratıcıları, Java'daki herhangi bir fazlalığı ortadan kaldırmak için ellerinden gelen her şeyi yaptılar. C++ bir şeyi 20 şekilde yapmanıza izin veriyorsa, Java bunu yalnızca tek bir şekilde yapmanıza izin verir.

Ancak ne Java programcıları ne de Java'nın yaratıcıları özgürlüğün olmamasından hoşlanmadılar. Ve bazen şeker, senin ve benim gibi sıradan insanlar için hayatı kolaylaştırır.

Bu arada, zaten bazı sözdizimsel şekerle karşılaştınız: otomatik kutulama ve kutudan çıkarma . Hadi karşılaştıralım:

uzun kod Kompakt kod
Integer a = new Integer(5);
int b = a.intValue();
Integer a = 5;
int b = a;
int b = 5;
Integer c = new Integer(b);
int b = 5;
Integer c = b;
Integer a = new Integer(1);
int b = 1;
if (a.intValue() == b)
{
   ...
}
Integer a = 1;
int b = 1;
if (a == b)
{
   ...
}

Soldaki gibi uzun kod yerine sağ tarafa daha kompakt kod yazabilirsiniz. Ve akıllı Java derleyicisi, kodun kısa versiyonuna dayalı olarak kodun ayrıntılı versiyonunu üretecektir. Sözdizimsel şeker tam olarak budur.


2. Değişken türünün çıkarımı: varanahtar kelime

Java 11'de derleyici daha da akıllı hale geldi ve artık kendisine atanan değerin türüne göre bildirilen bir değişkenin türünü belirleyebiliyor . Kodda şöyle görünür:

var name = value;

Nerede nameyeni bir değişkenin adı, değer başlangıç ​​değeridir ve vardeğişkeni bildirmek için kullanılan bir anahtar kelimedir. Ad değişkeninin türü, kendisine atanan değerin türü ile aynı olacaktır.

Örnekler:

Kodu nasıl görüyoruz? Derleyicinin gördüğü şey
var i = 1;
int i = 1;
var s = "Hello";
String s = "Hello";
var console = new Scanner(System.in);
Scanner console = new Scanner(System.in);
var list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>();
var data = new int[]{1, 2, 3};
int[] data = new int[]{1, 2, 3};

Derleyicinin kendisi, kendisine atanan değere göre değişkenin türünü belirler veya çıkarım yapar.

Programcılar dile böyle bir özelliğin eklenip eklenmeyeceği konusunda hararetle tartıştılar. Birçok kişi bunun varkötüye kullanılacağından ve sonuç olarak kodun okunabilirliğinin zarar göreceğinden korkuyordu.

Bunda doğruluk payı var, bu yüzden varkodun okunabilirliğini artırdığı yerde kullanmak en iyisidir. Örneğin, bunlar iki durumda:

Durum 1: Değişkene atanan değere bakıldığında, değişkenin türü hemen anlaşılır

kod Açıklama
var stream = url.getInputStream();
değişken birInputStream
var name = person.getFullName();
değişken birString

Bu durumlarda kullanmamalısınız . varPeki, değişkenin türü nedir?

kod Açıklama
var result = task.execute();
Değişkenin türünü belirlemek zordur
var status = person.getStatus();
Değişkenin türünü belirlemek zordur

Durum 2: Değişkenin türü, kodu anlamak için önemli değil

Kodun genellikle bir değişken üzerinde metot çağırmaya ihtiyacı yoktur, örneğin bir değişken bir şeyi geçici olarak depolamak için kullanıldığında. Bu durumda, varkesinlikle kullanmak kodun okunabilirliğini azaltmaz:

uzun kod Kompakt kod
var data = stream.getMetaData();
storage.save(data)
Akıştan meta verileri aldık streamve depoya kaydettik storage. Değişkenin databelirli türü önemli değildir.

altın ortalama

Şimdi aynı kodu yazmanın üç yolunu vereceğim. kullanmak varen iyi seçenek olacaktır.

kod Not
dest.writeHeaderInfo(src.getFileMetaInfo());
Çok kompakt
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Tam kararında
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Çok detaylı

1 satırlı sürümden 2 satırlı sürüme geçiş yaparak bir değişken adı ( headerInfo) kullanarak kodu biraz daha okunaklı hale getirdik. Artık yöntemin yalnızca meta bilgisini değil, başlık bilgisini de döndürdüğü açıktır.

Üçüncü versiyon aşırı ayrıntılı. Bunun headerInfoa olduğu FileMetaInfoyöntemden zaten oldukça açık getFileMetaInfo(). Meta bilginin amacı çok daha ilginç.



3. Elmas işleciyle türü atlamak:<>

Operatör ortaya çıkmadan önce bile var, derleyiciye toplama türlerini nasıl anlayacağını öğretme girişimleri oldu. Bu gösterimin biraz gereksiz göründüğünü kabul edeceksiniz:

ArrayList<String> list = new ArrayList<String>();

Java'nın yedinci sürümünden başlayarak, bir koleksiyon türü yazarken, bir değişken bildirirken belirtilmişse, koleksiyon öğelerinin türünü atlayabilirsiniz. Başka bir deyişle, yukarıdaki kod biraz kısaltılmış bir biçimde yazılabilir:

ArrayList<String> list = new ArrayList<>();

Gördüğünüz gibi, artık String'i ikinci kez yazmanıza gerek yok. var operatöründeki kadar havalı değil ama o zamanlar ilerleme gibi görünüyordu.

Koleksiyon tipindeki boş köşeli ayraçlar, iki açılı ayraç belli belirsiz bir elmasa benzediğinden, elmas operatörü olarak adlandırıldı.

varAnahtar kelimenin ve elmas operatörünün aynı anda kullanılması istenmeyen bir durumdur :

var list = new ArrayList<>();

Koleksiyonda depolanan öğelerin türü hakkında hiçbir bilgi yoktur ve koleksiyon türü ArrayList < Object > olacaktır.



4. Çift kaşlı ayraçlar

Hızlı dizi başlatmayı hatırlıyor musunuz?

Değerleri kaşlı ayraçlar içinde listeledik, şöyle:

örnekler
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

Java'nın yaratıcıları, bir dizinin öğelerini yazmayı basitleştirmek için süslü parantez kullanma fikrini sevdiler. Peki ya koleksiyonlar?

Java'nın yaratıcıları, koleksiyonlar için de yeterince yaratıcı düşünceye sahipti ve bu da onlara çift kaşlı ayraçlı bir numara kullanmalarına izin verdi.

Şekerli Şekersiz
var list = new ArrayList<String>()
{{
   add("Hello");
   add("How's");
   add("Life?");
}};
var list = new ArrayList<String>();

list.add("Hello");
list.add("How's");
list.add("Life?");

Derleyici soldaki örnekteki gibi bir kodla karşılaşırsa sağdaki koda çevirir.

Kod çok daha kompakt hale gelmez. listBuradaki tasarruflar oldukça önemsizdir: her seferinde yazmak zorunda değilsiniz . Değişken adı çok uzunsa bu yararlı olabilir.

Ama bir projede böyle bir kodla karşılaşırsanız şaşırmayın 🙂