1. Syntaktisk sukker

Programmører elsker, når noget kompleks kode eller logik kan skrives på et par linjer, hvilket gør koden kompakt og læsbar. Og skaberne af programmeringssprog hjælper nogle gange med dette.

En smart sprogfunktion, der lader dig tage en genvej (skrive mindre kode), kaldes syntaktisk sukker . Men for at være ærlig er der meget lidt af det i Java.

Javas skabere gjorde alt, hvad de kunne for at eliminere enhver redundans i Java. Hvis C++ lader dig gøre noget på 20 måder, så lader Java dig kun gøre det på én måde.

Men hverken Java-programmører eller Javas skabere kunne lide den manglende frihed. Og nogle gange gør sukker livet lettere for almindelige mennesker som dig og mig.

Forresten har du allerede stødt på noget syntaktisk sukker: autoboxing og unboxing . Lad os sammenligne:

Lang kode Kompakt kode
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)
{
   ...
}

I stedet for den lange kode som til venstre, kan du skrive den mere kompakte kode til højre. Og intelligent Java compiler vil generere den verbose version af koden baseret på den korte version af koden. Det er præcis, hvad syntaktisk sukker er.


2. Indledning af en variabels type: varnøgleordet

I Java 11 blev compileren endnu smartere og kan nu bestemme typen af ​​en erklæret variabel baseret på typen af ​​den værdi, der er tildelt den . I koden ser det sådan ud:

var name = value;

Hvor nameer navnet på en ny variabel, værdi er dens begyndelsesværdi og varer et nøgleord, der bruges til at erklære variablen. Navnevariablens type vil være den samme som typen af ​​den værdi, der er tildelt den.

Eksempler:

Hvordan vi ser koden Hvad compileren ser
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};

Compileren selv bestemmer, eller udleder, variablens type baseret på den værdi, der er tildelt den.

Programmører diskuterede heftigt om, hvorvidt de skulle tilføje en sådan funktion til sproget. Mange mennesker frygtede, at det varville blive misbrugt, og at kodelæsbarheden ville lide som følge heraf.

Der er et gran af sandhed i dette, så det er bedst at bruge, varhvor det øger kodens læsbarhed. For eksempel disse i to tilfælde:

Case 1: Ser man på den værdi, der er tildelt variablen, er variablens type umiddelbart klar

Kode Forklaring
var stream = url.getInputStream();
Variablen er enInputStream
var name = person.getFullName();
Variablen er aString

I disse tilfælde bør du ikke bruge var. Nå, hvad er variablens type?

Kode Forklaring
var result = task.execute();
Det er svært at bestemme variabelens type
var status = person.getStatus();
Det er svært at bestemme variabelens type

Case 2: Variablens type er ikke vigtig for at forstå koden

Kode har ofte ikke behov for at kalde metoder på en variabel, f.eks. når en variabel blot bruges til midlertidigt at lagre noget. I dette tilfælde reducerer brugen varbestemt ikke kodens læsbarhed:

Lang kode Kompakt kode
var data = stream.getMetaData();
storage.save(data)
Vi fik metadata fra streamstreamen og gemte dem i storagedepotet. Variablens dataspecifikke type er ikke vigtig.

Den gyldne middelvej

Nu vil jeg give tre måder at skrive den samme kode på. Brug varville være den bedste mulighed.

Kode Bemærk
dest.writeHeaderInfo(src.getFileMetaInfo());
For kompakt
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Helt rigtigt
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
For detaljeret

Når vi flyttede fra versionen med 1 linje til versionen på 2 linjer, gjorde vi koden lidt mere læsbar ved at bruge et variabelnavn ( headerInfo). Nu er det klart, at metoden ikke kun returnerer metainformation, men headerinformation.

Den tredje version er alt for omfattende. Det faktum, at headerInfodet er a, FileMetaInfofremgår allerede af getFileMetaInfo()metoden. Formålet med metainformationen er meget mere interessant.



3. Udeladelse af typen med diamantoperatoren:<>

Allerede før varoperatøren dukkede op, var der forsøg på at lære compileren, hvordan man udleder samlingstyper. Du er enig i, at denne notation ser lidt overflødig ud:

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

Startende fra den syvende version af Java, når du skriver en samlingstype, kunne du udelade typen af ​​samlingselementerne, hvis den blev angivet, når du deklarerede en variabel. Med andre ord kan koden ovenfor skrives i en let forkortet form:

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

Som du kan se, behøver du ikke længere at skrive String en anden gang. Ikke så cool som med var-operatøren, men det virkede som fremskridt på det tidspunkt.

De tomme vinkelbeslag i samlingstypen blev kaldt diamantoperatoren , da de to vinkelbeslag vagt minder om en diamant.

Det er uønsket at bruge søgeordet varog diamantoperatoren samme tid :

var list = new ArrayList<>();

Der er ingen information overhovedet om typen af ​​elementerne, der er gemt i samlingen, og samlingstypen vil være ArrayList < Objekt >.



4. Dobbelte krøllede seler

Husk hurtig array-initialisering?

Vi har lige anført værdier i krøllede seler som dette:

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

Javas skabere elskede ideen om at bruge krøllede seler til at forenkle skriveelementer i et array. Men hvad med samlinger?

Javas skabere havde også nok kreativ tænkning til samlinger, så de kunne bruge et trick med dobbelte krøllede seler.

Med sukker Uden sukker
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?");

Hvis compileren støder på kode som i eksemplet til venstre, konverterer den den til koden til højre.

Koden bliver ikke meget mere kompakt. Besparelsen her er ret ubetydelig: du behøver ikke skrive listhver gang. Dette kan være nyttigt, hvis variabelnavnet er meget langt.

Men hvis du støder på kode som denne i et projekt, skal du ikke blive overrasket 🙂