Referências a Construtores
Use ClassName::new para criar instâncias por meio de interfaces funcionais como Supplier e Function.
Referências a Construtores é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O que São Referências de Construtor?
Uma referência de construtor usa ClassName::new para criar objetos por meio de uma interface funcional. Os parâmetros da interface funcional correspondem aos parâmetros do construtor.
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)Construtor sem Argumentos como Fornecedor
Um construtor sem argumentos corresponde a 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); // 0Construtor com Dois Argumentos como BiFunction
Construtores com dois parâmetros correspondem a 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]Referência de Construtor em Stream.map
Converta cadeias de caracteres em objetos usando uma referência de construtor:
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)Referência de Construtor de Vetor
Crie vetores dinamicamente com Type[]::new. Isso é usado por 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);Padrão de Interface Factory
Defina uma interface funcional personalizada para fábricas e, em seguida, use referências de construtor:
@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);Injeção de Dependência com Referências de Construtor
As estruturas frequentemente usam fábricas funcionais para a instanciação tardia. As referências de construtor tornam esse padrão mais simples:
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");Escolhendo entre Expressão Lambda e Referência de Construtor
Use uma referência de construtor quando o corpo da expressão lambda apenas cria uma instância com 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());Tipos Genéricos e Referências de Construtor
As classes genéricas também funcionam — o tipo é inferido pelo contexto da interface funcional:
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()); // 0Coletores de Fluxo Usando Referências de Construtor
Use referências de construtor em coletores para criar contêineres de resultado personalizados:
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()); // aTipos Primitivos e Conversão Automática para Objetos
As referências de construtor para tipos encapsuladores lidam com a conversão automática para objetos:
// 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")); // 42Verificação Rápida
A que interface funcional corresponde uma referência de construtor sem argumentos, como ArrayList::new?
Recapitulação: Referências de Construtor
Principais conclusões:
- Sintaxe: ClassName::new — delega para o construtor correspondente
- Sem argumentos → Supplier<T>; um argumento → Function<T,R>; dois argumentos → BiFunction
- Construtor de vetor: Type[]::new — usado com Stream.toArray()
- Mais simples que uma expressão lambda quando o corpo dela apenas cria uma instância
- Use Collectors.toCollection(LinkedList::new) para obter resultados de coleções tipadas
Perguntas Frequentes
A aula “Referências a Construtores” é grátis?
Sim — o texto completo de “Referências a Construtores” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Referências a Construtores”?
Use ClassName::new para criar instâncias por meio de interfaces funcionais como Supplier e Function. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Referências a Construtores”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Referências a Métodos Estáticos
- Referências a Métodos de Instância Específica
- Referências a Métodos de Instância Arbitrária
- Referências a Construtores