Java 10 LocalVariable Type-inferentie

Dit artikel maakt deel uit van een reeks: • Java 10 LocalVariable Type-Inference (huidig ​​artikel) • Java 10 prestatieverbeteringen

• Java 10 nieuwe functies

1. Overzicht

Een van de meest zichtbare verbeteringen in JDK 10 is type-inferentie van lokale variabelen met initialisatieprogramma's.

Deze tutorial biedt de details van deze functie met voorbeelden.

2. Inleiding

Tot Java 9 moesten we het type van de lokale variabele expliciet vermelden en ervoor zorgen dat het compatibel was met de initialisatie die werd gebruikt om het te initialiseren:

String message = "Tot ziens, Java 9";

In Java 10 is dit hoe we een lokale variabele kunnen declareren:

@Test public void whenVarInitWithString_thenGetStringTypeVar () {var message = "Hallo, Java 10"; assertTrue (berichtinstantie van String); }

We bieden niet het gegevenstype van bericht. In plaats daarvan markeren we de boodschap als een var, en de compiler leidt het type bericht van het type initialisatieprogramma aan de rechterkant.

In het bovenstaande voorbeeld is het type bericht zou zijn Draad.

Merk op dat deze functie alleen beschikbaar is voor lokale variabelen met de initialisatieprogramma. Het kan niet worden gebruikt voor lidvariabelen, methodeparameters, retourtypen, enz. - de initialisatieprogramma is vereist omdat zonder welke compiler het type niet kan afleiden.

Deze verbetering helpt bij het verminderen van de standaardcode; bijvoorbeeld:

Map map = nieuwe HashMap ();

Dit kan nu worden herschreven als:

var idToNameMap = nieuwe HashMap ();

Dit helpt ook om te focussen op de variabelenaam in plaats van op het type variabele.

Een ander ding om op te merken is dat var is geen trefwoord - dit zorgt voor achterwaartse compatibiliteit voor programma's die var zeg, als een functie of variabelenaam. var is een gereserveerde typenaam, net als int.

Merk ten slotte op dat er geen runtime-overhead bij gebruik var noch maakt het Java tot een dynamisch getypeerde taal. Het type van de variabele wordt nog steeds afgeleid tijdens het compileren en kan later niet worden gewijzigd.

3. Illegaal gebruik van var

Zoals eerder gezegd, var werkt niet zonder de initialisatie:

var n; // error: kan 'var' niet gebruiken op variabele zonder initialisatieprogramma

Het zou ook niet werken als het werd geïnitialiseerd met nul:

var emptyList = null; // fout: variabele initialisatie is 'null'

Het werkt niet voor niet-lokale variabelen:

public var = "hallo"; // error: 'var' is hier niet toegestaan

Lambda-expressie heeft een expliciet doeltype nodig, en dus var kan niet worden gebruikt:

var p = (String s) -> s.length ()> 10; // error: lambda-expressie heeft een expliciet doeltype nodig

Hetzelfde is het geval met de array-initializer:

var arr = {1, 2, 3}; // error: array-initializer heeft een expliciet doeltype nodig

4. Richtlijnen voor gebruik var

Er zijn situaties waarin var legaal kunnen worden gebruikt, maar het is misschien geen goed idee om dit te doen.

Bijvoorbeeld in situaties waarin de code minder leesbaar zou kunnen worden:

var resultaat = obj.prcoess ();

Hier, hoewel een legaal gebruik van var, wordt het moeilijk om het type te begrijpen dat wordt geretourneerd door de werkwijze()waardoor de code minder leesbaar wordt.

java.nethas een speciaal artikel over stijlrichtlijnen voor inferentie van lokale variabelen in Java, waarin wordt beschreven hoe we ons oordeel moeten gebruiken bij het gebruik van deze functie.

Een andere situatie die u het beste kunt vermijden var bevindt zich in stromen met een lange pijplijn:

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

Gebruik van var kan ook een onverwacht resultaat geven.

Als we het bijvoorbeeld gebruiken met de diamantoperator die in Java 7 is geïntroduceerd:

var empList = nieuwe ArrayList ();

Het soort empListzal zijn ArrayListen niet Lijst. Als we dat willen ArrayList, we zullen expliciet moeten zijn:

var empList = nieuwe ArrayList ();

Gebruik makend van var met niet-herkenbare typen kan onverwachte fouten veroorzaken.

Als we bijvoorbeeld var met de anonieme klasse-instantie:

@Test openbare leegte whenVarInitWithAnonymous_thenGetAnonymousType () {var obj = new Object () {}; assertFalse (obj.getClass (). is gelijk aan (Object.class)); }

Nu, als we proberen een ander toe te wijzen Voorwerpnaar obj, zouden we een compilatiefout krijgen:

obj = nieuw object (); // error: Object kan niet worden geconverteerd naar 

Dit komt omdat het afgeleide type obj niet Voorwerp.

5. Conclusie

In dit artikel hebben we de nieuwe Java 10-inferentiefunctie voor lokale variabelen gezien met voorbeelden.

Zoals gewoonlijk zijn codefragmenten te vinden op GitHub.

De volgende » Verbeteringen in de prestaties van Java 10

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