Java 10 LocalVariable Type-inference

Denne artikel er en del af en serie: • Java 10 LocalVariable Type-Inference (nuværende artikel) • Java 10 Performance Forbedringer

• Java 10 nye funktioner

1. Oversigt

En af de mest synlige forbedringer i JDK 10 er typeforståelse af lokale variabler med initialisering.

Denne tutorial giver detaljerne i denne funktion med eksempler.

2. Introduktion

Indtil Java 9 var vi nødt til at nævne typen af ​​den lokale variabel eksplicit og sikre, at den var kompatibel med initialisereren, der blev brugt til at initialisere den:

Strengmeddelelse = "Farvel, Java 9";

I Java 10 er det sådan, hvordan vi kunne erklære en lokal variabel:

@Test offentlig ugyldig nårVarInitWithString_thenGetStringTypeVar () {var message = "Hej, Java 10"; assertTrue (beskedforekomst af streng); }

Vi angiver ikke datatypen for besked. I stedet markerer vi beskeden som en var, og compileren udleder typen af besked fra den type initialisering, der findes på højre side.

I ovenstående eksempel er typen af besked ville være Snor.

Bemærk, at denne funktion kun er tilgængelig for lokale variabler med initialisereren. Det kan ikke bruges til medlemsvariabler, metodeparametre, returtyper osv. - initialiseringen er påkrævet, uden hvilken kompilator ikke kan udlede typen.

Denne forbedring hjælper med at reducere kogepladekoden; for eksempel:

Kortkort = nyt HashMap ();

Dette kan nu omskrives som:

var idToNameMap = ny HashMap ();

Dette hjælper også med at fokusere på variabelnavnet snarere end på variabeltypen.

En anden ting at bemærke er, at var er ikke et nøgleord - dette sikrer bagudkompatibilitet for programmer, der bruger var sig som en funktion eller et variabelnavn. var er et reserveret type navn, ligesom int.

Endelig bemærk, at der er ingen runtime overhead i brug var det gør heller ikke Java til et dynamisk skrevet sprog. Variabelens type udledes stadig på kompileringstidspunktet og kan ikke ændres senere.

3. Ulovlig brug af var

Som nævnt tidligere, var fungerer ikke uden initialiseringen:

var n; // fejl: kan ikke bruge 'var' på variabel uden initialisering

Det ville heller ikke fungere, hvis det blev initialiseret med nul:

var emptyList = null; // fejl: variabel initialisering er 'null'

Det fungerer ikke for ikke-lokale variabler:

offentlig var = "hej"; // fejl: 'var' er ikke tilladt her

Lambda-udtryk har brug for eksplicit måltype og dermed var kan ikke bruges:

var p = (Streng s) -> s.længde ()> 10; // fejl: lambda-udtryk har brug for en eksplicit måltype

Det samme er tilfældet med array-initialiseringen:

var arr = {1, 2, 3}; // error: array initializer har brug for en eksplicit måltype

4. Retningslinjer for brug var

Der er situationer, hvor var kan bruges lovligt, men det er måske ikke en god ide at gøre det.

For eksempel i situationer, hvor koden kan blive mindre læselig:

var resultat = obj.prcoess ();

Her, selv om en lovlig anvendelse af var, bliver det vanskeligt at forstå typen returneret af behandle()gør koden mindre læselig.

java.nhar en dedikeret artikel om stilretningslinjer for lokal variabel type inferens i Java, der taler om, hvordan vi skal bruge dømmekraft, mens vi bruger denne funktion.

En anden situation, hvor det er bedst at undgå var er i vandløb med lang rørledning:

var x = emp.getProjects.stream () .findFirst () .map (String :: længde) .ellerElse (0);

Anvendelse af var kan også give uventet resultat.

For eksempel, hvis vi bruger det med diamantoperatøren introduceret i Java 7:

var empList = ny ArrayList ();

Typen af empListvil være ArrayListog ikke Liste. Hvis vi vil have det ArrayList, bliver vi nødt til at være eksplicit:

var empList = ny ArrayList ();

Ved brug af var med ikke-denotable typer kan forårsage uventet fejl.

For eksempel hvis vi bruger var med den anonyme klasseinstans:

@Test offentlig ugyldig nårVarInitWithAnonymous_thenGetAnonymousType () {var obj = nyt objekt () {}; assertFalse (obj.getClass (). er lig med (Object.class)); }

Nu, hvis vi prøver at tildele en anden Objekttil obj, ville vi få en kompileringsfejl:

obj = nyt objekt (); // fejl: Objekt kan ikke konverteres til 

Dette skyldes, at den afledte type obj ikke er Objekt.

5. Konklusion

I denne artikel så vi den nye Java 10 lokale variabel type inferensfunktion med eksempler.

Som sædvanligt kan kodeuddrag findes på GitHub.

Næste » Java 10 Performance Forbedringer

$config[zx-auto] not found$config[zx-overlay] not found