Java 10 LocalVariable Type-Inference

Denne artikkelen er en del av en serie: • Java 10 LocalVariable Type-Inference (nåværende artikkel) • Java 10 ytelsesforbedringer

• Java 10 nye funksjoner

1. Oversikt

En av de mest synlige forbedringene i JDK 10 er typeinferanse av lokale variabler med initialiserere.

Denne opplæringen gir detaljene i denne funksjonen med eksempler.

2. Introduksjon

Inntil Java 9 måtte vi nevne typen av den lokale variabelen eksplisitt og sikre at den var kompatibel med initialisereren som ble brukt til å initialisere den:

Strengmelding = "Farvel, Java 9";

I Java 10 er dette hvordan vi kan erklære en lokal variabel:

@Test offentlig ugyldig nårVarInitWithString_thenGetStringTypeVar () {var message = "Hei, Java 10"; assertTrue (meldingsinstans av streng); }

Vi oppgir ikke datatypen for beskjed. I stedet markerer vi meldingen som en var, og kompilatoren angir typen beskjed fra typen initialisering som er til stede på høyre side.

I eksemplet ovenfor, typen beskjed ville vært String.

Merk at denne funksjonen bare er tilgjengelig for lokale variabler med initialisereren. Den kan ikke brukes for medlemsvariabler, metodeparametere, returtyper osv. - initialisereren er nødvendig, uten hvilken kompilator ikke kan utlede typen.

Denne forbedringen hjelper til med å redusere kjeleplatekoden; for eksempel:

Kartkart = nytt HashMap ();

Dette kan nå skrives om som:

var idToNameMap = ny HashMap ();

Dette hjelper også til å fokusere på variabelnavnet i stedet for på variabeltypen.

En annen ting å merke seg er at var er ikke et nøkkelord - Dette sikrer bakoverkompatibilitet for programmer som bruker var si som en funksjon eller et variabelnavn. var er et reservert navn, akkurat som int.

Til slutt, merk at det er ingen kjøretid overhead i bruk var det gjør heller ikke Java til et dynamisk skrevet språk. Variabeltypen blir fremdeles utledet ved kompileringstidspunktet og kan ikke endres senere.

3. Ulovlig bruk av var

Som nevnt tidligere, var fungerer ikke uten initialisereren:

var n; // feil: kan ikke bruke 'var' på variabel uten initialisering

Det ville heller ikke fungere hvis det ble initialisert med null:

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

Det fungerer ikke for ikke-lokale variabler:

offentlig var = "hei"; // feil: 'var' er ikke tillatt her

Lambda-uttrykk trenger eksplisitt måltype, og dermed var kan ikke brukes:

var p = (Streng s) -> s.lengde ()> 10; // feil: lambda-uttrykk trenger en eksplisitt måltype

Det samme er tilfelle med array-initialisereren:

var arr = {1, 2, 3}; // error: array initializer trenger en eksplisitt måltype

4. Retningslinjer for bruk var

Det er situasjoner der var kan brukes lovlig, men det kan ikke være lurt å gjøre det.

For eksempel i situasjoner der koden kan bli mindre lesbar:

var resultat = obj.prcoess ();

Her, selv om en lovlig bruk av varblir det vanskelig å forstå typen som returneres av prosess()gjør koden mindre lesbar.

java.nhar en dedikert artikkel om stilretningslinjer for lokal variabel type inferens i Java som snakker om hvordan vi skal bruke dømmekraft mens vi bruker denne funksjonen.

En annen situasjon der det er best å unngå var er i bekker med lang rørledning:

var x = emp.getProjects.stream () .findFirst () .map (String :: lengde) .orElse (0);

Bruk av var kan også gi uventet resultat.

For eksempel, hvis vi bruker den med diamantoperatøren introdusert i Java 7:

var empList = ny ArrayList ();

Typen av empListvil være ArrayListog ikke Liste. Hvis vi vil at det skal være ArrayList, må vi være eksplisitte:

var empList = ny ArrayList ();

Ved hjelp av var med ikke-denoterbare typer kan forårsake uventede feil.

For eksempel hvis vi bruker var med den anonyme klasseinstansen:

@Test offentlig ugyldig nårVarInitWithAnonymous_thenGetAnonymousType () {var obj = new Object () {}; assertFalse (obj.getClass (). tilsvarer (Object.class)); }

Nå, hvis vi prøver å tildele en annen Gjenstandtil obj, ville vi få en kompileringsfeil:

obj = nytt objekt (); // feil: Objektet kan ikke konverteres til 

Dette er fordi den avledede typen obj ikke er det Gjenstand.

5. Konklusjon

I denne artikkelen så vi den nye Java 10 lokale variabel type inferansefunksjon med eksempler.

Som vanlig kan du finne kodebiter på GitHub.

Neste » Java 10 ytelsesforbedringer

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