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 |
---|---|
|
|
|
|
|
|
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: var
nø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 name
er navnet på en ny variabel, værdi er dens begyndelsesværdi og var
er 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 |
---|---|
|
|
|
|
|
|
|
|
|
|
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 var
ville 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, var
hvor 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 |
---|---|
|
Variablen er enInputStream |
|
Variablen er aString |
I disse tilfælde bør du ikke bruge var
. Nå, hvad er variablens type?
Kode | Forklaring |
---|---|
|
Det er svært at bestemme variabelens type |
|
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 var
bestemt ikke kodens læsbarhed:
Lang kode | Kompakt kode |
---|---|
|
Vi fik metadata fra stream streamen og gemte dem i storage depotet. Variablens data specifikke type er ikke vigtig. |
Den gyldne middelvej
Nu vil jeg give tre måder at skrive den samme kode på. Brug var
ville være den bedste mulighed.
Kode | Bemærk |
---|---|
|
For kompakt |
|
Helt rigtigt |
|
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 headerInfo
det er a, FileMetaInfo
fremgår allerede af getFileMetaInfo()
metoden. Formålet med metainformationen er meget mere interessant.
3. Udeladelse af typen med diamantoperatoren:<>
Allerede før var
operatø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 var
og diamantoperatoren på 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 |
---|
|
|
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 |
---|---|
|
|
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 list
hver 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 🙂
GO TO FULL VERSION