CodeGym /Kurslar /Java SELF AZ /Java kompilatorunun növləri çıxarması

Java kompilatorunun növləri çıxarması

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

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 autoboxingunboxingdir. Müqayisə edin:

Uzun kod Qısa 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)
{
   ...
}

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
var i = 1;
int i = 1;
var s = "Salam";
String s = "Salam";
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};

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
var stream = url.getInputStream();
Dəyişənin tipi InputStream
var name = person.getFullName();
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
var result = task.execute();
Dəyişənin tipini müəyyən etmək çətindir
var status = person.getStatus();
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
var data = stream.getMetaData();
storage.save(data)
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
dest.writeHeaderInfo(src.getFileMetaInfo());
Çox yığcam
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
İdeal
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Ç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
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

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
var list = new ArrayList<String>()
{{
   add("Salam");
   add("Necəsən");
   add("İşlər");
}};
var list = new ArrayList<String>();

list.add("Salam");
list.add("Necəsən");
list.add("İşlər");

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 🙂


Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION