私はJava 8の本を読んでいますが、私が再現したサンプルが付属しています:
@FunctionalInterface
public interface Action {
public void perform();
}
実装者:
public final class ActionImpl implements Action {
public ActionImpl() {
System.out.println("constructor[ActionIMPL]");
}
@Override
public void perform() {
System.out.println("perform method is called..");
}
}
発信者:
public final class MethodReferences {
private final Action action;
public MethodReferences(Action action) {
this.action = action;
}
public void execute() {
System.out.println("execute->called");
action.perform();
System.out.println("execute->exist");
}
public static void main(String[] args) {
MethodReferences clazz = new MethodReferences(new ActionImpl());
clazz.execute();
}
}
これが呼び出された場合、以下が出力に出力されます。
constructor[ActionIMPL]
execute->called
perform method is called..
execute->exist
すべて問題ありませんが、メソッド参照を使用すると、perform message
メソッドが出力されません! これはなぜですか、何か足りないのですか?
このコードを使用する場合:
MethodReferences clazz = new MethodReferences(() -> new ActionImpl());
clazz.execute();
またはこのコード:
final MethodReferences clazz = new MethodReferences(ActionImpl::new);
これは印刷されます:
execute->called
constructor[ActionIMPL]
execute->exist
例外メッセージなどは出力されません。Java 8 1.8.25 64 ビットを使用しています。
アップデート
私のように勉強している読者にとって、これは正しい実行コードです。
呼び出し元のクラスを作成しました。
クラスコンストラクターにパラメーターとして渡す必要がある「アクション機能インターフェイスから実行する」空のメソッドを実装する必要があるため、MethodReference
「空のコンストラクターである MethodReferenceCall のコンストラクター」を参照し、それを使用できます。
public class MethodReferenceCall {
public MethodReferenceCall() {
System.out.println("MethodReferenceCall class constructor called");
}
public static void main(String[] args) {
MethodReferenceCall clazz = new MethodReferenceCall();
MethodReferences constructorCaller = new MethodReferences(MethodReferenceCall::new);
constructorCaller.execute();
}
}