0Pricing
Java Academy · Aula

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

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

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

Tipos 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")); // 42

Verificaçã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

  1. Referências a Métodos Estáticos
  2. Referências a Métodos de Instância Específica
  3. Referências a Métodos de Instância Arbitrária
  4. Referências a Construtores
← Voltar para Java Academy