JavaRush /Kurslar /All lectures for UZ purposes /Java kompilyatori tomonidan turlarni chiqarish

Java kompilyatori tomonidan turlarni chiqarish

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Sintaksis shakar

Dasturchilar murakkab kod yoki mantiqni bir necha qator yozish orqali ifodalashni yaxshi ko'radi va kod ixcham va o'qilishi oson bo'ladi. Ba'zan dasturlash tillarini ishlab chiqarganlar ularga bu borada yordam beradi.

Tilda foydalanuvchi uchun qisqaroq yo'lni taklif qiluvchi xususiyatlar sintaksis shakar deb ataladi. Aslida, Java-da bu juda kam.

Java ishlab chiqaruvchilari Java-dan imkon qadar ortiqcha narsalarni yo'q qilib tashlashdi. C++ da bir narsani o'n xil usulda qilish mumkin bo'lsa, Java-da odatda buni faqat bitta usulda qilish mumkin.

Ammmo, bunday unifikatsiya na Java dasturchilariga, na Java yaratuvchilariga yoqadi. Va ba'zida ular oddiy odamlar uchun hayotni osonlashtiradilar, masalan, biz bilan.

Siz allaqachon sintaksis shakarga oid narsani o'rganib chiqqansiz - bu autoboxing va unboxing. Taqqoslang:

Uzun kod Ixcham 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)
{
   ...
}

Chapdagi uzun kod o'rniga, siz o'ngdagi kabi yanada ixcham kod yozishingiz mumkin. Aqlli Java-kompilyator qisqa kod asosida uning to'liq versiyasini o'zi yaratadi. Bu sintaksis shakar hisoblanadi.


2. O'zgaruvchi turi chiqarish – var

Java 11 da kompilyator yanada aqlli bo'ldi va endi o'zgaruvchi turini qiymat turi asosida aniqlay oladi. Bu kodda quyidagicha ko'rinadi:

var isim = qiymat;

Qayerda isim — yangi o'zgaruvchi ismi, qiymat — uning boshlang'ich qiymati, va var — o'zgaruvchi e'lon qilish uchun ishlatiladigan kalit so'zdir. isim o'zgaruvchi turi unga berilayotgan qiymat bilan bir xil bo'ladi.

Misollar:

Bu kodni qanday ko'ramiz Kompilyator nima ko'radi
var i = 1;
int i = 1;
var s = "Salom";
String s = "Salom";
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 o'zgaruvchining turini aniqlaydi yoki, boshqa so'z bilan aytganda, o'zgaruvchi turini chiqaradi berilayotgan qiymat asosida.

Dasturchilar orasida var imkoniyatini tilga qo'shish kerakmi yoki yo'qmi degan mavzuda ko'plab munozaralar bo'ldi. Ko'pchilik var dan ortiqcha foydalana boshlanishidan va kodning o'qilishi qiyinlashishidan qo'rqishdi.

Bunda bir tomchi haqiqat bor, shuning uchun var dan foydalanishni kodning o'qilishligini oshiradigan joylarda ishlatish yaxshiroqdir. Masalan, quyidagi ikki holatda:

Holat 1: O'zgaruvchi qiymatiga qarab, o'zgaruvchi turi darhol tushunarli

Kod Izoh
var stream = url.getInputStream();
O'zgaruvchi turi InputStream
var name = person.getFullName();
O'zgaruvchi turi String

Ammo, quyidagi hollar var dan foydalanish yaramaydi. Qani, o'zgaruvchi turi nima ekanligini ayting-chi?

Kod Izoh
var result = task.execute();
O'zgaruvchi turini aniqlash qiyin
var status = person.getStatus();
O'zgaruvchi turini aniqlash qiyin

Holat 2: O'zgaruvchi turi kodni tushunish uchun muhim emas

Kodda ko'pincha o'zgaruvchi hech qanday metodni chaqirmaydi – o'zgaruvchi faqat vaqtincha biror narsani saqlash uchun ishlatiladi. var foydalanish bu yerda kodni tushunishni kamaytirmaydi:

Uzun kod Ixcham kod
var data = stream.getMetaData();
storage.save(data)
Biz stream dan metama'lumotlarni olib, storage ga saqladik. data o'zgaruvchi turi qanday bo'lgani – muhim emas.

Oltin o'rtaliq

Hoziroq bitta va bir xil kodni yozishning uch usulini keltiraman. var dan foydalanish optimal variant bo'ladi.

Kod Izoh
dest.writeHeaderInfo(src.getFileMetaInfo());
Juda ixcham
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
A'lo darajada
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Juda mantikli

Birinchi satrdagi variantdan ikkinchi satrdagi varianta o'tganimizda, biz o'zgaruvchi nomi (headerInfo) orqali kodni biroz tushunarli qildik. Endi aniqki, metod oddiygina metama'lumotni qaytarmaydi, balki sarlavhalar haqida ma'lumot qaytaradi.

Uchinchi variant ortiqcha bo'lardi. Nima bo'libdi, headerInfo turi FileMetaInfo ekan – bu allaqachon getFileMetaInfo() metodidan deyarli aniq edi. Bundan qiziqarli narsa metama'lumotning maqsadi.



3. Turlarni tushirish — diamond operator: <>

var operatori paydo bo'lishidan oldin, kompilyatorni kollektsiyalar turlarini chiqarishga o'rgatishga urinishlar bo'ldi. Bu yozuv biroz ortiqcha ko'rinadi:

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

Java ning yettinchi versiyasidan boshlab, kollektsiya elementi turi o'zgaruvchi e'lon qilingan paytda ko'rsatilgan bo'lsa, turini yozmaslik mumkin bo'ldi. Shu bilan gapda yuqoridagi kodni biroz qisqartirilgan shaklda yozish mumkin:

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

Ko'rib turganingizdek, String turini ikkinchi marotaba yozish shart emas. var operatordan foydalanishga qaraganda unchalik soliq emas, lekin o'sha vaqtda bu ham yutuq edi.

Kollektsiya turida bo'sh uchburchak qavslar diamond operator deb ataldi: ikkita qavs brilyant siluetini eslatar edi.

var va diamond operator ni bir vaqtning o'zida ishlatish tavsiya etilmaydi:

var list = new ArrayList<>();

Bu yerda kollektsiya saqlaydigan turga oid hech qanday ma'lumot qolmaydi va tur ArrayList<Object> sifatida aniqlanadi.



4. Ikkita qavslardan foydalanish

Massivni tezkor ishga tushirishni eslaysizmi?

Biz u yerda faqat qavslarda qiymatlarni sanab o'tardik:

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

Java yaratuvchilari ma'lumotlarni massivinga yozish uchun qavslardan foydalanish g'oyasini yoqtirdilar. Ammo, kollektsiyalarda qanday bo'lishi kerak?

Kollektsiyalar uchun ham xayol yetdi: ikki marta qavslardan foydalanishga ruxsat berildi.

Shakar bilan Shakarsiz
var list = new ArrayList<String>()
{{
   add("Salom");
   add("Qanday");
   add("Ishlar");
}};
var list = new ArrayList<String>();

list.add("Salom");
list.add("Qanday");
list.add("Ishlar");

Agar kompilyator chapdagi misoldagi kodni uchratsa, uni o'ngdagi kodga o'tkazadi.

Kod juda ixchamroq bo'lib qolmaydi. Asosan kichkina detallarni tejash: har safar list deb yozmaslik kerak. Bu, o'zgaruvchi nomi juda uzun bo'lsa, foydali bo'lishi mumkin.

Agar kimningdir loyihasida bunday kod uchratsangiz, ajablanmang 🙂


Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION