0Pricing
Java Academy · Leçon

Références vers des constructeurs

Utilisez ClassName::new pour créer des instances via des interfaces fonctionnelles telles que Supplier et Function.

Références vers des constructeurs est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Que sont les références de constructeur ?

Une référence de constructeur utilise ClassName::new pour créer des objets par l'intermédiaire d'une interface fonctionnelle. Les paramètres de l'interface fonctionnelle correspondent à ceux du constructeur.

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)

Constructeur sans argument comme Supplier

Un constructeur sans argument correspond à 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); // 0

Constructeur à deux arguments comme BiFunction

Les constructeurs à deux paramètres correspondent à 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]

Référence de constructeur dans Stream.map

Convertissez des chaînes en objets à l'aide d'une référence de constructeur :

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)

Référence de constructeur de tableau

Créez des tableaux dynamiquement avec Type[]::new. Cette construction est utilisée par Stream.toArray() :

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);

Modèle d'interface d'usine

Définissez une interface fonctionnelle personnalisée pour les fabriques, puis utilisez des références de constructeur :

@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);

Injection de dépendances avec des références de constructeur

Les frameworks utilisent souvent des fabriques fonctionnelles pour une instanciation différée. Les références de constructeur rendent ce modèle clair :

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");

Choisir entre une lambda et une référence de constructeur

Utilisez une référence de constructeur lorsque le corps de la lambda se résume à new Type(args) :

// 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());

Types génériques et références de constructeur

Les classes génériques fonctionnent également : le type est déduit du contexte de l'interface fonctionnelle :

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()); // 0

Collecteurs de flux utilisant des références de constructeur

Utilisez des références de constructeur dans les collecteurs pour créer des conteneurs de résultats personnalisés :

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()); // a

Types primitifs et autoboxing

Les références de constructeur pour les types enveloppes prennent en charge l'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")); // 42

Vérification rapide

À quelle interface fonctionnelle correspond une référence de constructeur sans argument comme ArrayList::new ?

Récapitulatif : références de constructeur

Points essentiels :

  • Syntaxe : ClassName::new — délègue au constructeur correspondant
  • Sans argument → Supplier<T> ; un argument → Function<T,R> ; deux arguments → BiFunction
  • Constructeur de tableau : Type[]::new — utilisé avec Stream.toArray()
  • Plus lisible qu'une lambda lorsque son corps se résume à « new Type(args) »
  • Utilisez Collectors.toCollection(LinkedList::new) pour obtenir des résultats de collection typés

Questions Fréquemment Posées

La leçon « Références vers des constructeurs » est-elle gratuite ?

Oui — le texte complet de « Références vers des constructeurs » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Références vers des constructeurs » ?

Utilisez ClassName::new pour créer des instances via des interfaces fonctionnelles telles que Supplier et Function. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Références vers des constructeurs » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Références vers des méthodes statiques
  2. Références vers des méthodes d’instance précises
  3. Références vers des méthodes d’instance arbitraires
  4. Références vers des constructeurs
← Retour à Java Academy