1. Sintaktik şəkər
Proqramçılar, mürəkkəb kod və ya məntiqi iki cümlə ilə yazmağı, kod isə qısa və oxunaqlı olmağı sevirlər. Bəzən proqramlaşdırma dillərinin yaradıcıları onlara bu işdə kömək edirlər.
Dilin ağıllı xüsusiyyətləri, daha qısa yol (daha az kod yazmaq) istifadə etməyə imkan verən, sintaktik şəkər adlanır. Amma düzünü desək, Java-da belə xüsusiyyətlər çox azdır.
Java inkişaf etdiriciləri Java-dan mümkün olan artıq şeyləri çıxarmaq üçün hər şeyi etdilər. Əgər C++-də bir şeyi on fərqli üsulla etmək mümkündürsə, Java-da, çox vaxt, bunu yalnız bir üsulla etmək mümkündür.
Amma bu unifikasiya nə Java-proqramçılara, nə də Java yaradanlara xoş gəldi. Bəzən onlar bizim kimi adi dostların həyatını sadələşdirirlər.
Siz artıq sintaktik şəkər kateqoriyasına aid edilə biləcək bir şeylə tanış oldunuz — bu autoboxing və unboxingdir. Müqayisə edin:
Uzun kod | Qısa kod |
---|---|
|
|
|
|
|
|
Soldakı uzun kod yerinə sağdakı kimi daha qısa kod yaza bilərsiniz. Ağıllı Java-kompilyator bu qısa kod əsasında tam versiyasını özü generasiya edəcək. Bu, sintaktik şəkərdir.
2. Dəyişənin tipinin çıxarılması – var
Java 11-də kompilyator daha da ağıllandı və indi o, dəyərə görə təyin edilən dəyişənin tipini avtomatik olaraq müəyyən edə bilər. Koddakı görünüşü belədir:
var ad = dəyər;
Burada ad
— yeni dəyişənin adı, dəyər — onun ilk dəyəri, və var
— dəyişəni elan etmək üçün istifadə olunan açar söz. Dəyişənin tipi ad ona təyin edilən dəyərin tipi ilə eyni olacaq.
Nümunələr:
Kodu biz necə görürük | Kompilyator necə görür |
---|---|
|
|
|
|
|
|
|
|
|
|
Kompilyator özü dəyişənin tipini müəyyən edir və ya başqa sözlə desək, onun tipini çıxarır ona təyin edilən dəyər əsasında.
Proqramçılar arasında var
istifadəsi barədə mübahisələr çox olub. Bəziləri qorxurdu ki, var
ilə kodun oxunaqlığı azalacaq.
Bunlarda həqiqət payı var, ona görə də var
oxunaqlığı artıran yerlərdə istifadə olunmalıdır. Məsələn, bu iki halda:
Hal 1: Dəyişənin dəyərinə baxanda onun tipi aydın olur
Kod | Şərh |
---|---|
|
Dəyişənin tipi InputStream |
|
Dəyişənin tipi String |
Amma bu hallarda var
istifadə etmək məsləhət deyil. Cavab verin: dəyişənin tipi nədir?
Kod | Şərh |
---|---|
|
Dəyişənin tipini müəyyən etmək çətindir |
|
Dəyişənin tipini müəyyən etmək çətindir |
Hal 2: Dəyişənin tipi kodun başa düşülməsi üçün vacib deyil
Tez-tez kodda elə hallar ola bilər ki, dəyişəndən heç bir metod çağırılmır – dəyişən sadəcə olaraq müvəqqəti məlumat saxlamaq üçün istifadə olunur. Belə hallarda var
istifadəsi kodun oxunaqlığını azaltmır:
Uzun kod | Yığcam kod |
---|---|
|
stream -dən metaverilənləri aldıq və onları storage -də saxladıq. data dəyişəninin tipi vacib deyil. |
Qızıl orta
İndi eyni kodun üç yazılışına baxaq. var
istifadəsi ən optimal seçimdir.
Kod | Qeyd |
---|---|
|
Çox yığcam |
|
İdeal |
|
Çox ətraflı |
Birinci nümunədən ikinciyə keçərkən, dəyişən adını (headerInfo
) əlavə etməklə biraz oxunaqlıq əldə etdik. İndi daha aydındır ki, metod sadəcə metainformasiya deyil, başlıq haqqında məlumat qaytarırdı.
Üçüncü nümunə isə artıq olardı. headerInfo
-nun tipi FileMetaInfo
olduğu bəllidir. Amma burada daha maraqlı olan, bu metainformasiyanın hansı məqsədlə istifadə edilməsidir.
3. Tipin buraxılması — diamond operatoru: <>
var
operatoru hələ yaranmamışdan əvvəl, kompilyatora kolleksiyaların tiplərini çıxarmağı öyrətmək üçün cəhdlər olmuşdur. Razılaşın ki, bu yazı bir az çox yüklənmiş görünür:
ArrayList<String> list = new ArrayList<String>();
Java-nın yeddinci versiyasından başlayaraq, kolleksiyanın tipi dəyişən elan olunarkən göstərildiyi halda, kolleksiyanın elementlərinin tipini yazmamaq (buraxmaq) mümkün oldu. Yəni, yuxarıdakı kodu bir az daha qısa şəkildə yazmaq olar:
ArrayList<String> list = new ArrayList<>();
Gördüyünüz kimi, ikinci dəfə String tipini yazmağa ehtiyac yoxdur. Bu, var
operatoru qədər havalı olmasa da, vaxtında bu da bir nailiyyət hesab olunurdu.
Kolleksiyanın tipində boş üçbucaq mötərizələrinə diamond operatoru adı verildi: iki mötərizənin konturu uzaqdan brilyant siluetini xatırladırdı.
Eyni zamanda həm var
, həm də diamond operatoru istifadə etmək tövsiyə olunmur:
var list = new ArrayList<>();
Kolleksiyanın saxladığı tip haqqında heç bir məlumat qalmır və tip ArrayList<Object> olaraq müəyyən edilir.
4. İkiqat fiqurlu mötərizələr
Massivlərin sürətli başlanğıcını yadınızda saxlayırsınız?
Orada sadəcə olaraq dəyərləri fiqurlu mötərizələrdə göstərirdik:
Nümunələr |
---|
|
|
Java yaradıcılarına fiqurlu mötərizələrdən istifadə etməklə massivləri sadələşdirmək ideyası maraqlı gəldi. Bəs kolleksiyalarla nə edək?
Kolleksiyalar üçün də fantaziya yetərli oldu: ikiqat fiqurlu mötərizə hiyləsini işlətməyə icazə verdilər.
Şəkərlə | Şəkərsiz |
---|---|
|
|
Kompilyator soldakı nümunədə olan kodu oxuyanda onu sağdakı kod kimi dəyişəcək.
Kod çox da kompakt olmur. Daha çox xırdalıqlara qənaət var: hər dəfə list
yazmağa ehtiyac qalmır. Bu, dəyişənin adı çox uzun olduqda sərfəli ola bilər.
Lakin əgər birinin layihəsində belə kod görsəniz, təəccüblənməyin 🙂
GO TO FULL VERSION