Konstruktorreferenzen
Verwenden Sie ClassName::new, um über funktionale Schnittstellen wie Supplier und Function Instanzen zu erstellen.
Konstruktorreferenzen ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was sind Konstruktorreferenzen?
Eine Konstruktorreferenz verwendet ClassName::new, um Objekte über eine funktionale Schnittstelle zu erstellen. Die Parameter der funktionalen Schnittstelle entsprechen den Parametern des Konstruktors.
import java.util.function.*;
class Person {
String name;
Person(String name) { this.name = name; }
public String toString() { return "Person(" + name + ")"; }
}
// Function<String, Person> — calls Person(String)
Function<String, Person> factory = Person::new;
Person p = factory.apply("Alice");
System.out.println(p); // Person(Alice)Konstruktor ohne Argumente als Supplier
Ein Konstruktor ohne Argumente passt zu Supplier<T>:
class Counter {
int count = 0;
void inc() { count++; }
}
Supplier<Counter> newCounter = Counter::new;
Counter c1 = newCounter.get();
Counter c2 = newCounter.get(); // independent instances
c1.inc();
System.out.println(c1.count); // 1
System.out.println(c2.count); // 0Konstruktor mit zwei Argumenten als BiFunction
Konstruktoren mit zwei Parametern passen zu BiFunction<T,U,R>:
record Point(int x, int y) {}
BiFunction<Integer, Integer, Point> makePoint = Point::new;
Point p = makePoint.apply(3, 4);
System.out.println(p); // Point[x=3, y=4]Konstruktorreferenz in Stream.map
Konvertieren Sie Zeichenketten mithilfe einer Konstruktorreferenz in Objekte:
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("Alice","Bob","Carol");
List<Person> people = names.stream()
.map(Person::new) // calls new Person(name) for each
.collect(Collectors.toList());
people.forEach(System.out::println);
// Person(Alice)
// Person(Bob)
// Person(Carol)Array-Konstruktorreferenz
Erstellen Sie Arrays dynamisch mit Type[]::new. Dies wird von Stream.toArray() verwendet:
import java.util.stream.*;
String[] arr = Stream.of("a","b","c")
.toArray(String[]::new);
for (String s : arr) System.out.print(s + " ");
// a b c
int[] sizes = {3, 5, 2};
String[][] matrix = Arrays.stream(sizes)
.mapToObj(String[]::new)
.toArray(String[][]::new);Muster für Factory-Schnittstellen
Definieren Sie eine eigene funktionale Schnittstelle für Factorys und verwenden Sie anschließend Konstruktorreferenzen:
@FunctionalInterface
interface Factory<T> {
T create(String config);
}
class DBConnection {
String url;
DBConnection(String url) { this.url = url; }
public String toString() { return "DB(" + url + ")"; }
}
Factory<DBConnection> dbFactory = DBConnection::new;
DBConnection conn = dbFactory.create("jdbc:postgresql://localhost/mydb");
System.out.println(conn);Dependency Injection mit Konstruktorreferenzen
Frameworks verwenden häufig funktionale Factorys für eine verzögerte Instanziierung. Konstruktorreferenzen machen dieses Muster übersichtlich:
import java.util.function.*;
class ServiceLocator {
private final Map<String, Supplier<?>> registry = new HashMap<>();
<T> void register(String name, Supplier<T> factory) {
registry.put(name, factory);
}
@SuppressWarnings("unchecked")
<T> T get(String name) { return (T) registry.get(name).get(); }
}
ServiceLocator loc = new ServiceLocator();
loc.register("counter", Counter::new);
Counter c = loc.get("counter");Lambda oder Konstruktorreferenz auswählen
Verwenden Sie eine Konstruktorreferenz, wenn der Lambda-Body nur aus new Type(args) besteht:
// Lambda:
Function<String, Person> f1 = name -> new Person(name);
// Constructor reference (preferred):
Function<String, Person> f2 = Person::new;
// When you need extra logic, stick with lambda:
Function<String, Person> f3 = name -> new Person(name.trim().toLowerCase());Generische Typen und Konstruktorreferenzen
Auch generische Klassen funktionieren — der Typ wird aus dem Kontext der funktionalen Schnittstelle abgeleitet:
import java.util.*;
import java.util.function.*;
// ArrayList::new matches Supplier<ArrayList<String>>
Supplier<List<String>> listFactory = ArrayList::new;
List<String> l1 = listFactory.get();
List<String> l2 = listFactory.get(); // independent lists
l1.add("hello");
System.out.println(l2.size()); // 0Stream-Collectors mit Konstruktorreferenzen
Verwenden Sie Konstruktorreferenzen in Collectors, um eigene Ergebnissammlungen zu erstellen:
import java.util.stream.*;
// Collect into a LinkedList using a constructor reference supplier
LinkedList<String> linked = Stream.of("a","b","c")
.collect(Collectors.toCollection(LinkedList::new));
System.out.println(linked.getFirst()); // aPrimitive Typen und Autoboxing
Konstruktorreferenzen für Wrapper-Typen unterstützen Autoboxing:
// Integer::new is deprecated in Java 9+, but illustrates the concept
// Use Integer.valueOf or just autoboxing in modern Java
Function<String, Integer> intParser = Integer::parseInt; // static method ref
System.out.println(intParser.apply("42")); // 42Kurzer Check
Zu welcher funktionalen Schnittstelle passt eine Konstruktorreferenz ohne Argumente wie ArrayList::new?
Zusammenfassung: Konstruktorreferenzen
Die wichtigsten Punkte:
- Syntax: ClassName::new — delegiert an den passenden Konstruktor
- Ohne Argumente → Supplier<T>; ein Argument → Function<T,R>; zwei Argumente → BiFunction
- Array-Konstruktor: Type[]::new — wird mit Stream.toArray() verwendet
- Übersichtlicher als ein Lambda, wenn der Lambda-Body nur 'new Type(args)' ist
- Verwenden Sie Collectors.toCollection(LinkedList::new) für typisierte Collection-Ergebnisse
Häufig gestellte Fragen
Ist die Lektion „Konstruktorreferenzen“ kostenlos?
Ja — der vollständige Text von „Konstruktorreferenzen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Konstruktorreferenzen“?
Verwenden Sie ClassName::new, um über funktionale Schnittstellen wie Supplier und Function Instanzen zu erstellen. Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Java Academy zu starten?
Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Konstruktorreferenzen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?
Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Statische Methodenreferenzen
- Methodenreferenzen auf einer bestimmten Instanz
- Methodenreferenzen auf beliebigen Instanzen
- Konstruktorreferenzen