Supplierを使ったインスタンス生成

リフレクションを使用してインスタンスを生成する

  public <T> T create(Class<T> type) throws InstantiationException, IllegalAccessException {
    return type.class.newInstance();
  }
  
  public void process() {
    Foo foo = create(Foo.class);
    ...
  }

このコードは、InstantiationExceptionとIllegalAccessExceptionがスローされる可能性があることを意識する必要があります。また、このコード例の場合は、デフォルトコンストラクタを持つクラスの場合しか生成できません。

Supplierを使用してインスタンスを生成する

Java8のSupplierを使用したコードの例は次のようになります。

  public <T> T generate(Supplier<T> supplier) {
    return supplier.get();
  }
  
  public void process() {
    Foo foo = generate(Foo::new);
    ...
  }

Supplierを使用する場合には、リフレクションを使った場合のような例外はスローされません。また、Fooクラスにデフォルトコンストラクタがない場合はコンパイル時に検出されます。 例として、Barクラスを定義してみます。

  public class Bar () {
    private final String msg;
    public Bar(String msg) {
      this.msg = msg;
    }
  }

Barのインスタンスを生成するコードは次のようになります。

  public void bar() {
    Bar bar = generate(() -> new Bar("baz"));
    ...
  }