1. Syntaktisk sukker
Programmerere elsker når kompleks kode eller logikk kan skrives på et par linjer, noe som gjør koden kompakt og lesbar. Og skaperne av programmeringsspråk hjelper noen ganger med dette.
En smart språkfunksjon som lar deg ta en snarvei (skrive mindre kode) kalles syntaktisk sukker . Men for å være ærlig er det veldig lite av det i Java.
Javas skapere gjorde alt de kunne for å eliminere all redundans i Java. Hvis C++ lar deg gjøre noe på 20 måter, lar Java deg gjøre det bare på én måte.
Men verken Java-programmerere eller Javas skapere likte mangelen på frihet. Og noen ganger gjør sukker livet lettere for vanlige folk som deg og meg.
Forresten, du har allerede møtt litt syntaktisk sukker: autoboksing og unboxing . La oss sammenligne:
Lang kode | Kompakt kode |
---|---|
|
|
|
|
|
|
I stedet for den lange koden som til venstre, kan du skrive den mer kompakte koden til høyre. Og intelligent Java-kompilator vil generere den detaljerte versjonen av koden basert på kortversjonen av koden. Dette er nøyaktig hva syntaktisk sukker er.
2. Inferens av en variabels type: var
nøkkelordet
I Java 11 ble kompilatoren enda smartere og kan nå bestemme typen av en deklarert variabel basert på typen verdi som er tildelt den . I koden ser det slik ut:
var name = value;
Hvor name
er navnet på en ny variabel, verdi er dens opprinnelige verdi, og var
er et nøkkelord som brukes til å deklarere variabelen. Typen av navnevariabelen vil være den samme som typen verdi som er tilordnet den.
Eksempler:
Hvordan vi ser koden | Hva kompilatoren ser |
---|---|
|
|
|
|
|
|
|
|
|
|
Kompilatoren selv bestemmer, eller utleder, variabelens type basert på verdien som er tildelt den.
Programmerere diskuterte heftig om de skulle legge til en slik funksjon til språket. Mange fryktet at det var
ville bli misbrukt og at kodelesbarheten ville bli skadelidende.
Det er et korn av sannhet i dette, så det er best å bruke var
der det øker lesbarheten til koden. For eksempel disse i to tilfeller:
Tilfelle 1: Ser man på verdien som er tildelt variabelen, er variabelens type umiddelbart tydelig
Kode | Forklaring |
---|---|
|
Variabelen er enInputStream |
|
Variabelen er aString |
I disse tilfellene bør du ikke bruke var
. Vel, hva er variabelens type?
Kode | Forklaring |
---|---|
|
Det er vanskelig å bestemme variabelens type |
|
Det er vanskelig å bestemme variabelens type |
Tilfelle 2: Variabelens type er ikke viktig for å forstå koden
Kode har ofte ikke behov for å kalle metoder på en variabel, for eksempel når en variabel bare brukes til å lagre noe midlertidig. I dette tilfellet reduserer bruk var
definitivt ikke lesbarheten til koden:
Lang kode | Kompakt kode |
---|---|
|
Vi fikk metadata fra stream strømmen og lagret den i storage depotet. Variabelens data spesifikke type er ikke viktig. |
Den gylne middelvei
Nå skal jeg gi tre måter å skrive den samme koden på. Bruk var
ville være det beste alternativet.
Kode | Merk |
---|---|
|
For kompakt |
|
Akkurat passe |
|
For detaljert |
Ved å gå fra versjonen med 1 linje til versjonen på 2 linjer, gjorde vi koden litt mer lesbar ved å bruke et variabelnavn ( headerInfo
). Nå er det klart at metoden ikke bare returnerer metainformasjon, men overskriftsinformasjon.
Den tredje versjonen er altfor detaljert. Det faktum at headerInfo
er a FileMetaInfo
er allerede ganske klart av getFileMetaInfo()
metoden. Formålet med metainformasjonen er mye mer interessant.
3. Utelate typen med diamantoperatoren:<>
Allerede før var
operatøren dukket opp, var det forsøk på å lære kompilatoren hvordan man kan utlede samlingstyper. Du er enig i at denne notasjonen ser litt overflødig ut:
ArrayList<String> list = new ArrayList<String>();
Fra og med den syvende versjonen av Java, når du skriver en samlingstype, kan du utelate typen til samlingselementene hvis den ble spesifisert når du deklarerte en variabel. Med andre ord kan koden ovenfor skrives i en litt forkortet form:
ArrayList<String> list = new ArrayList<>();
Som du kan se, trenger du ikke lenger å skrive String en gang til. Ikke så kult som med var-operatøren, men det virket som fremgang på den tiden.
De tomme vinkelbrakettene i samlingstypen ble kalt diamantoperatøren , siden de to vinkelbrakettene vagt ligner en diamant.
Det er uønsket å bruke nøkkelordet var
og diamantoperatoren samtidig :
var list = new ArrayList<>();
Det er ingen informasjon i det hele tatt om typen av elementene som er lagret i samlingen, og samlingstypen vil være ArrayList < Object >.
4. Doble krøllete seler
Husker du rask array-initialisering?
Vi har nettopp listet opp verdier i krøllete klammeparenteser, som dette:
Eksempler |
---|
|
|
Javas skapere elsket ideen om å bruke krøllete bukseseler for å forenkle å skrive elementer i en matrise. Men hva med samlinger?
Javas skapere hadde nok kreativ tenkning for samlinger også, slik at de kunne bruke et triks med doble krøllete seler.
Med sukker | Uten sukker |
---|---|
|
|
Hvis kompilatoren møter kode som i eksempelet til venstre, konverterer den den til koden til høyre.
Koden blir ikke mye mer kompakt. Besparelsene her er ganske ubetydelige: du trenger ikke skrive list
hver gang. Dette kan være nyttig hvis variabelnavnet er veldig langt.
Men hvis du kommer over kode som dette i et prosjekt, ikke bli overrasket 🙂
GO TO FULL VERSION