JavaRush /Курстар /All lectures for KK purposes /Java-компиляторымен типтерді шығару

Java-компиляторымен типтерді шығару

All lectures for KK purposes
Деңгей , Сабақ
Қол жетімді

1. Синтаксистік қант

Бағдарламалаушылар күрделі код немесе логиканы екі-үш жолмен жазуға болатындығын жақсы көреді, және код ықшам әрі оқылатын. Ал тіл жасайтындар кейде оларға бұл жағынан көмектеседі.

Тілдің айлалы ерекшеліктері, олар арқылы қысқа жолды (аз код жазып) пайдалануға болады, синтаксистік қант деп аталады. Шынын айтқанда, Java тілінде ондай көп емес.

Java жасаушылар Java-дан мүмкін болатын артықшылықты жою үшін барлығын жасады. Егер C++ тілінде бір нәрсені он түрлі жолмен жасауға болатын болса, Java-да көбінесе тек бір жолмен жасауға болады.

Бірақ мұндай біркелкілік Java бағдарламалаушыларына да, Java жасаушыларына да ұнай қоймайды. Кейде олар біз сияқты қарапайым жігіттердің өмірін жеңілдетеді.

Айтпақшы, сіздер autoboxing пен unboxing сияқты синтаксистік қантқа жататын нәрсемен танысып үлгердіңіздер. Салыстырыңыз:

Ұзын код Ықшам код
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)
{
   ...
}

Сол жақтағыдай ұзын кодтың орнына оң жақтағыдай ықшам код жаза аласыз. Ақылды Java-компилятор қысқаша кодтың негізінде оның толық нұсқасын өзі жасайды. Бұл дегеніміз синтаксистік қант.


2. Айнымалының типін шығару – var

Java 11-де компилятор одан да ақылды болды, енді айнымалының типін оның мәнінің типі бойынша анықтай алады. Ол кодта осыған ұқсайды:

var аты = мәні;

Мұндағы аты — жаңа айнымалының атауы, мәні — оның бастапқы мәні, ал var — айнымалыны жариялау үшін қолданылатын кілт сөзі. аты айнымалысының типі оған берілген мәннің типімен бірдей болады.

Мысалдар:

Бұл кодты біз қалай көреміз Компилятор не көреді
var i = 1;
int i = 1;
var s = "Сәлем";
String s = "Сәлем";
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};

Компилятор айнымалының типін өзі анықтайды немесе мәнге негізделе отырып айнымалының типін шығарады.

Бағдарламалаушылар арасында бұл мүмкіндікті тілге қосу жөнінде қызу пікірталастар болды. Көпшілігі var-ды пайдалану оқылуды нашарлатады деп алаңдады.

Бұл жерде шындықтың үлесі бар, сондықтан var-ды кодтың оқылымдылығын арттыратындай жерлерде қолданған дұрыс. Мысалы, осы екі жағдайда:

Жағдай 1: айнымалының мәніне қарап, оның типі бірден анықталады

Код Түсініктеме
var stream = url.getInputStream();
Айнымалының типі InputStream
var name = person.getFullName();
Айнымалының типі String

Ал бұл жағдайларында var қолдануға болмайды. Әйтеуір, айнымалының типі қандай?

Код Түсініктеме
var result = task.execute();
Айнымалының типін анықтау қиын
var status = person.getStatus();
Айнымалының типін анықтау қиын

Жағдай 2: айнымалының типі кодты түсіну үшін маңызды емес

Кодта айнымалының ешқандай әдісі шақырылмайтын жағдайлар жиі кездеседі – айнымалы тек бірдеңені уақытша сақтау үшін ғана қолданылады. Мұнда var-ды қолдану кодтың түсініктемесін еш қысқартпайды:

Ұзын код Қысқа код
var data = stream.getMetaData();
storage.save(data)
Біз деректер ағынынан stream метадеректерін алып, оларды storage сақтау қоймасына сақтадық. data айнымалысының типі қандай екені маңызды емес.

Алтын орта

Енді бір кодты жазудың үш әдісін келтірейін. var-ды пайдалану ең жақсы нұсқа болады.

Код Ескерту
dest.writeHeaderInfo(src.getFileMetaInfo());
Тым ықшам
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Керемет
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Тым егжей-тегжейлі

1 жолдан 2 жолға өткен кезде айнымалы атының (headerInfo) есебінен кодқа аздап түсініктілік қостық. Енді әдіс тек мета деректерді қайтармағаны, бірақ тақырып ақпаратын қайтарғаны айқын болды.

Үшінші нұсқа артық болар еді. headerInfo типінің FileMetaInfo екенін бәрібір getFileMetaInfo() әдісі арқылы түсінікті болды. Мета деректердің тағайындалуы әлдеқайда қызықтырақ.



3. Типті түсіру — diamond операторы: <>

var операторынан бұрын коллекциялардың типтерін шығарып алуға әрекет жасалды. Мына жазба сәл артық көрінеді дейсіз бе:

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

Java-ның жетінші нұсқасынан бастап, айнымалы жарияланған кезде коллекция элементтерінің типін жазуды өткізіп жіберуге болатын еді. Яғни, жоғарыдағы код аздап қысқартылған түрде жазылуы мүмкін:

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

Көріп тұрғаныңыздай, String типін екінші рет жазудың қажеті жоқ. Бұл var операторымен салыстырғанда онша әсерлі көрінбесе де, сол кездегі үлкен жетістік болған.

Коллекция типіндегі бос үшбұрышты жақшаларды оператор diamond деп атаған: екі жақша алыстан бриллианттың силуэтін еске түсіретін.

var және оператор diamond екеуін бір уақытта пайдалану ұсынылмайды:

var list = new ArrayList<>();

Коллекция сақтайтын тип туралы ақпарат мүлдем жоқ, ол ArrayList<Object> типіне анықталады.



4. Қос бұрышты жақшалар

Массивті тез инициализациялауды есіңізде сақтаңыз ба?

Ол жерде біз жай ғана мәндерді бұрышты жақшаларда тізе беретінбіз:

Мысалдар
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

Java жасаушылары деректерді массивке ықшам түрде жазу үшін жақшаларды қолдану идеясын ұнатты. Бірақ коллекциялар ше?

Коллекциялар үшін де қиял жеткілікті болды: қос бұрышты жақшалармен трюк жасауға рұқсат етілді.

Қантпен Қантсыз
var list = new ArrayList<String>()
{{
   add("Сәлем");
   add("Қалың қалай");
   add("Қалайсың");
}};
var list = new ArrayList<String>();

list.add("Сәлем");
list.add("Қалың қалай");
list.add("Қалайсың");

Егер компилятор сол жақтағы мысалдағы сияқты кодты кездестірсе, оны оң жақтағы кодқа түрлендіреді.

Код қажетті ықшамдыққа жете қоймайды. Мұнда ұсақ-түйектен үнем: әр жолы list-ті жазудың қажеті жоқ. Айнымалы аты өте ұзын болған жағдайда бұл пайдалы болуы мүмкін.

Біреудің жобасында осындай кодты кездестірсеңіз, таң қалмаңыз 🙂


Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION