Java 10: Local Variable Type Inference (JEP 286) – var richtig einsetzen
Was ist Local Variable Type Inference?
Ab Java 10 können lokale Variablen mit var deklariert werden, ohne den Typ explizit anzugeben. Der Compiler leitet den Typ vom Initialisierungsausdruck ab. Dies gilt nur für lokale Variablen in Methoden, Initialisierungsblöcken, for-Schleifen, try-with-resources etc.
Vorher vs. Jetzt
// Expliziter Typ (alt)
String url = "https://example.com";
List<String> list = new ArrayList<>();
var url = "https://example.com"; // Typ: String
var list = new ArrayList<String>(); // Typ: ArrayList<String>
var map = new HashMap<Integer, String>(); // Typ: HashMap<Integer, String>
Wichtige Regeln & Einschränkungen
- Initialisierung Pflicht:
var x;→ Compiler-Fehler (Typ kann nicht inferiert werden). - Keine Typinferenz für: Instanzvariablen (Felder), Methodenparameter, Rückgabetypen,
catch-Parameter. - Kein dynamischer Typwechsel: Einmal inferiert, ist der Typ statisch fest.
- Kein Runtime-Overhead: Kompilierzeit-Feature, Bytecode identisch zu expliziter Deklaration.
- Boilerplate-Reduktion: Besonders bei komplexen Generics nützlich:
var map = new HashMap<Integer, List<String>>();
Beispiele
1. In for-Schleifen
var names = List.of("Anna", "Bernd", "Clara");
for (var name : names) {
System.out.println(name);
}
for (var i = 0; i < names.size(); i++) {
System.out.println(names.get(i));
}
2. try-with-resources
try (var in = new FileInputStream("data.txt");
var reader = new BufferedReader(new InputStreamReader(in))) {
// ...
}
3. Streams & Lambdas
var numbers = List.of(1, 2, 3, 4, 5);
var even = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// even ist List<Integer>
Wann var verwenden – und wann nicht
| ✅ Gut geeignet | ❌ Eher vermeiden |
|---|---|
Komplexe Generics (Map<K, List<V>>) |
Primitive Typen (var i = 0 → int ist klarer) |
| Anonyme Klassen / Lambda-Ergebnisse | Wenn Typ nicht offensichtlich ist (Lesbarkeit leidet) |
| Lokale Variablen in kurzem Scope | Public API-Signaturen (Felder, Parameter, Returns) |
try-with-resources-Variablen |
Wenn expliziter Typ Dokumentationswert hat |
Fazit
var ist ein rein syntaktisches Zucker-Feature, das Code lesbarer machen kann, aber mit Bedacht eingesetzt werden sollte. Die Typinferenz erfolgt zur Compile-Zeit – zur Laufzeit ändert sich nichts.
Java
- Java Primitive Datentypen: Vollständiger Leitfaden mit Beispielen
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Type Casting meistern: Von Widening zu Narrowing und darüber hinaus
- Java static erklärt: Variablen, Methoden und Blöcke – Praxisbeispiele