0Pricing
Java Academy · レッスン

コンストラクター参照

ClassName::new を使い、Supplier や Function などの関数型インターフェース経由でインスタンスを作成します。

「コンストラクター参照」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

コンストラクター参照とは

コンストラクター参照では、ClassName::new を使用して、関数型インターフェース経由でオブジェクトを作成します。関数型インターフェースのパラメーターは、コンストラクターのパラメーターに対応します。

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)

Supplier としての引数なしコンストラクター

引数なしコンストラクターは 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

BiFunction としての 2 引数コンストラクター

2 つのパラメーターを持つコンストラクターは 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]

Stream.map でのコンストラクター参照

コンストラクター参照を使用して、文字列をオブジェクトに変換します:

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)

配列のコンストラクター参照

Type[]::new を使用して、配列を動的に作成します。これは 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);

ファクトリーインターフェースパターン

ファクトリー用のカスタム関数型インターフェースを定義し、コンストラクター参照を使用します:

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

コンストラクター参照による依存性注入

フレームワークでは、遅延インスタンス化のために関数型ファクトリーをよく使用します。コンストラクター参照を使うと、このパターンをすっきり記述できます:

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

ラムダ式とコンストラクター参照の使い分け

ラムダ式の本体が単に 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());

ジェネリック型とコンストラクター参照

ジェネリッククラスでも使用できます。型は、関数型インターフェースのコンテキストから推論されます:

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

コンストラクター参照を使用したストリームコレクター

コレクターでコンストラクター参照を使用して、カスタムの結果コンテナーを構築します:

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

プリミティブ型とオートボクシング

ラッパー型のコンストラクター参照は、オートボクシングに対応します:

// 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

クイックチェック

ArrayList::new のような引数なしコンストラクター参照は、どの関数型インターフェースに適合しますか?

復習:コンストラクター参照

重要なポイント:

  • 構文:ClassName::new — 対応するコンストラクターに処理を委譲します
  • 引数なし → Supplier<T>、1 引数 → Function<T,R>、2 引数 → BiFunction
  • 配列コンストラクター:Type[]::new — Stream.toArray() とともに使用します
  • ラムダ式の本体が単に「new Type(args)」だけの場合、ラムダ式より簡潔です
  • 型付きコレクションの結果には Collectors.toCollection(LinkedList::new) を使用します

よくある質問

「コンストラクター参照」レッスンは無料ですか?

はい。「コンストラクター参照」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「コンストラクター参照」で何を学びますか?

ClassName::new を使い、Supplier や Function などの関数型インターフェース経由でインスタンスを作成します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「コンストラクター参照」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. static メソッド参照
  2. 特定のインスタンスのインスタンスメソッド参照
  3. 任意のインスタンスメソッド参照
  4. コンストラクター参照
← Java Academyに戻る