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
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 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: varnø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 nameer navnet på en ny variabel, verdi er dens opprinnelige verdi, og varer 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
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};

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 varville bli misbrukt og at kodelesbarheten ville bli skadelidende.

Det er et korn av sannhet i dette, så det er best å bruke varder 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
var stream = url.getInputStream();
Variabelen er enInputStream
var name = person.getFullName();
Variabelen er aString

I disse tilfellene bør du ikke bruke var. Vel, hva er variabelens type?

Kode Forklaring
var result = task.execute();
Det er vanskelig å bestemme variabelens type
var status = person.getStatus();
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 vardefinitivt ikke lesbarheten til koden:

Lang kode Kompakt kode
var data = stream.getMetaData();
storage.save(data)
Vi fikk metadata fra streamstrømmen og lagret den i storagedepotet. Variabelens dataspesifikke type er ikke viktig.

Den gylne middelvei

Nå skal jeg gi tre måter å skrive den samme koden på. Bruk varville være det beste alternativet.

Kode Merk
dest.writeHeaderInfo(src.getFileMetaInfo());
For kompakt
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
Akkurat passe
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
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 headerInfoer a FileMetaInfoer allerede ganske klart av getFileMetaInfo()metoden. Formålet med metainformasjonen er mye mer interessant.



3. Utelate typen med diamantoperatoren:<>

Allerede før varoperatø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 varog 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
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

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
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 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 listhver 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 🙂