Java 10 LocalVariable Type-Inference

Dieser Artikel ist Teil einer Reihe: • Java 10 LocalVariable Type-Inference (aktueller Artikel) • Java 10-Leistungsverbesserungen

• Java 10 Neue Funktionen

1. Übersicht

Eine der sichtbarsten Verbesserungen in JDK 10 ist die Typinferenz lokaler Variablen mit Initialisierern.

Dieses Tutorial enthält die Details dieser Funktion mit Beispielen.

2. Einführung

Bis Java 9 mussten wir den Typ der lokalen Variablen explizit erwähnen und sicherstellen, dass sie mit dem Initialisierer kompatibel ist, mit dem sie initialisiert wurde:

String message = "Good bye, Java 9";

In Java 10 können wir auf diese Weise eine lokale Variable deklarieren:

@Test public void whenVarInitWithString_thenGetStringTypeVar() { var message = "Hello, Java 10"; assertTrue(message instanceof String); }

Wir geben nicht den Datentyp der Nachricht an . Stattdessen markieren wir die Nachricht als var , und der Compiler leitet den Nachrichtentyp aus dem Typ des auf der rechten Seite vorhandenen Initialisierers ab.

Im obigen Beispiel wäre der Nachrichtentyp String .

Beachten Sie, dass diese Funktion nur für lokale Variablen mit dem Initialisierer verfügbar ist. Es kann nicht für Elementvariablen, Methodenparameter, Rückgabetypen usw. verwendet werden. Der Initialisierer ist erforderlich, da der Compiler den Typ nicht ableiten kann.

Diese Verbesserung hilft bei der Reduzierung des Boilerplate-Codes. zum Beispiel:

Map map = new HashMap();

Dies kann jetzt wie folgt umgeschrieben werden:

var idToNameMap = new HashMap();

Dies hilft auch, sich auf den Variablennamen und nicht auf den Variablentyp zu konzentrieren.

Zu beachten ist auch, dass var kein Schlüsselwort ist. Dies stellt die Abwärtskompatibilität für Programme sicher, die var say als Funktions- oder Variablennamen verwenden. var ist ein reservierter Typname, genau wie int .

Beachten Sie schließlich, dass die Verwendung von var weder einen Laufzeitaufwand verursacht noch Java zu einer dynamisch typisierten Sprache macht. Der Typ der Variablen wird zum Zeitpunkt der Kompilierung noch abgeleitet und kann später nicht mehr geändert werden.

3. Illegale Verwendung von var

Wie bereits erwähnt, funktioniert var ohne den Initialisierer nicht:

var n; // error: cannot use 'var' on variable without initializer

Es würde auch nicht funktionieren, wenn es mit null initialisiert würde :

var emptyList = null; // error: variable initializer is 'null'

Bei nicht lokalen Variablen funktioniert dies nicht:

public var = "hello"; // error: 'var' is not allowed here

Der Lambda-Ausdruck benötigt einen expliziten Zieltyp und daher kann var nicht verwendet werden:

var p = (String s) -> s.length() > 10; // error: lambda expression needs an explicit target-type

Gleiches gilt für den Array-Initialisierer:

var arr = { 1, 2, 3 }; // error: array initializer needs an explicit target-type

4. Richtlinien für die Verwendung von var

Es gibt Situationen, in denen var legal verwendet werden kann, dies ist jedoch möglicherweise keine gute Idee.

Zum Beispiel in Situationen, in denen der Code möglicherweise weniger lesbar wird:

var result = obj.prcoess();

Obwohl dies eine legale Verwendung von var ist , wird es hier schwierig, den vom process () zurückgegebenen Typ zu verstehen, wodurch der Code weniger lesbar wird.

java.nethas ein spezieller Artikel über Stilrichtlinien für die Inferenz lokaler Variablentypen in Java, in dem erläutert wird, wie wir bei Verwendung dieser Funktion die Beurteilung verwenden sollten.

Eine andere Situation, in der es am besten ist, var zu vermeiden, sind Streams mit langer Pipeline:

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

Die Verwendung von var kann auch zu unerwarteten Ergebnissen führen.

Wenn wir es beispielsweise mit dem in Java 7 eingeführten Diamantoperator verwenden:

var empList = new ArrayList();

Der Typ von empList ist ArrayList und nicht List . Wenn wir wollen, dass es ArrayList ist , müssen wir explizit sein:

var empList = new ArrayList();

Die Verwendung von var mit nicht denotierbaren Typen kann zu unerwarteten Fehlern führen.

Wenn wir beispielsweise var mit der anonymen Klasseninstanz verwenden:

@Test public void whenVarInitWithAnonymous_thenGetAnonymousType() { var obj = new Object() {}; assertFalse(obj.getClass().equals(Object.class)); }

Wenn wir nun versuchen , ein anderes zuweisen Objekt zu obj , würden wir einen Kompilierungsfehler erhalten:

obj = new Object(); // error: Object cannot be converted to 

Dies liegt daran, dass der abgeleitete Typ von obj nicht Object ist .

5. Schlussfolgerung

In diesem Artikel haben wir die neue Inferenzfunktion für lokale Java 10-Variablentypen mit Beispielen gesehen.

Wie üblich finden Sie Code-Schnipsel auf GitHub.

Weiter » Java 10-Leistungsverbesserungen