CodeGym /Curs Java /Modulul 1 /Inferența tipului de către compilatorul Java

Inferența tipului de către compilatorul Java

Modulul 1
Nivel , Lecţie
Disponibil

1. Zahar sintactic

Programatorilor le place când un cod complex sau o logică poate fi scris în câteva rânduri, făcând codul compact și ușor de citit. Iar creatorii limbajelor de programare ajută uneori cu asta.

O caracteristică de limbaj elegant care vă permite să utilizați o comandă rapidă (scrieți mai puțin cod) se numește zahăr sintactic . Dar, ca să fiu sincer, există foarte puțin în Java.

Creatorii lui Java au făcut tot ce le-a putut pentru a elimina orice redundanță în Java. Dacă C++ vă permite să faceți ceva în 20 de moduri, atunci Java vă permite să faceți acest lucru într-un singur fel.

Dar nici programatorilor Java, nici creatorilor Java nu le-a plăcut lipsa de libertate. Și, uneori, zahărul face viața mai ușoară pentru oamenii obișnuiți ca tine și mine.

Apropo, ați întâlnit deja niște zahăr sintactic: autoboxing și unboxing . Să comparăm:

Cod lung Cod compact
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)
{
   ...
}

În loc de codul lung ca în stânga, puteți scrie codul mai compact în dreapta. Și compilatorul Java inteligent va genera versiunea verbosă a codului pe baza versiunii scurte a codului. Acesta este exact ceea ce este zahărul sintactic.


2. Deducerea tipului unei variabile: varcuvântul cheie

În Java 11, compilatorul a devenit și mai inteligent și poate determina acum tipul unei variabile declarate pe baza tipului valorii atribuite acesteia . În cod, arată astfel:

var name = value;

Unde nameeste numele unei noi variabile, valoarea este valoarea sa inițială și vareste un cuvânt cheie folosit pentru a declara variabila. Tipul variabilei nume va fi același cu tipul valorii atribuite acesteia.

Exemple:

Cum vedem codul Ce vede compilatorul
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};

Compilatorul însuși determină sau deduce tipul variabilei pe baza valorii atribuite acesteia.

Programatorii au dezbătut aprins dacă să adauge o astfel de caracteristică limbajului. Mulți oameni se temeau că acest lucru varva fi abuzat și că lizibilitatea codului va avea de suferit ca urmare.

Există un sâmbure de adevăr în acest lucru, așa că cel mai bine este să utilizați varacolo unde crește lizibilitatea codului. De exemplu, acestea în două cazuri:

Cazul 1: Privind valoarea atribuită variabilei, tipul variabilei este imediat clar

Cod Explicaţie
var stream = url.getInputStream();
Variabila este anInputStream
var name = person.getFullName();
Variabila este aString

În aceste cazuri, nu ar trebui să utilizați var. Ei bine, care este tipul variabilei?

Cod Explicaţie
var result = task.execute();
Este dificil de determinat tipul variabilei
var status = person.getStatus();
Este dificil de determinat tipul variabilei

Cazul 2: Tipul variabilei nu este important pentru înțelegerea codului

Codul de multe ori nu are nevoie să apeleze metode pe o variabilă, de exemplu atunci când o variabilă este pur și simplu folosită pentru a stoca temporar ceva. În acest caz, utilizarea varcu siguranță nu reduce lizibilitatea codului:

Cod lung Cod compact
var data = stream.getMetaData();
storage.save(data)
Am primit metadate din streamflux și le-am salvat în storagedepozit. Tipul dataspecific al variabilei nu este important.

Mediul de aur

Acum voi oferi trei moduri de a scrie același cod. Utilizarea varar fi cea mai bună opțiune.

Cod Notă
dest.writeHeaderInfo(src.getFileMetaInfo());
Prea compact
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Exact
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Prea detaliat

Trecând de la versiunea cu 1 linie la versiunea pe 2 rânduri, am făcut codul puțin mai lizibil utilizând un nume de variabilă ( headerInfo). Acum este clar că metoda returnează nu doar meta informații, ci și informații de antet.

Cea de-a treia versiune este prea prolixa. Faptul că headerInfoeste a FileMetaInfoeste deja destul de clar din getFileMetaInfo()metodă. Scopul metainformațiilor este mult mai interesant.



3. Omiterea tipului cu operatorul diamant:<>

Chiar înainte de varapariția operatorului, au existat încercări de a învăța compilatorul cum să deducă tipurile de colecții. Veți fi de acord că această notație pare puțin redundantă:

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

Începând de la a șaptea versiune de Java, atunci când scrieți un tip de colecție, puteți omite tipul elementelor de colecție dacă a fost specificat la declararea unei variabile. Cu alte cuvinte, codul de mai sus poate fi scris într-o formă ușor prescurtată:

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

După cum puteți vedea, nu mai trebuie să scrieți String a doua oară. Nu la fel de cool ca cu operatorul var, dar părea un progres la momentul respectiv.

Parantezele unghiulare goale din tipul de colecție au fost numite operator de diamant , deoarece cele două paranteze unghiulare seamănă vag cu un diamant.

Nu este de dorit să folosiți varcuvântul cheie și operatorul diamant în același timp :

var list = new ArrayList<>();

Nu există deloc informații despre tipul elementelor stocate în colecție, iar tipul de colecție va fi ArrayList < Object >.



4. Acolade duble

Vă amintiți inițializarea rapidă a matricei?

Am enumerat doar valorile în acolade, astfel:

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

Creatorilor Java le-a plăcut ideea de a folosi acolade pentru a simplifica scrierea elementelor unei matrice. Dar cum rămâne cu colecțiile?

Creatorii lui Java au avut suficientă gândire creativă și pentru colecții, permițându-le să folosească un truc cu bretele duble.

Cu zahar Fara zahar
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?");

Dacă compilatorul întâlnește cod ca în exemplul din stânga, atunci îl convertește în codul din dreapta.

Codul nu devine mult mai compact. Economiile aici sunt destul de nesemnificative: nu trebuie să scrii listde fiecare dată. Acest lucru poate fi util dacă numele variabilei este foarte lung.

Dar dacă întâlniți astfel de cod într-un proiect, nu vă mirați 🙂


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