Ссылки на методы конструктора Java 8
Я читаю Java 8 book
это идет с образцом, который я воспроизводлю..
@FunctionalInterface
public interface Action{public void perform();}
Исполнитель
public final class ActionImpl implements Action
{
public ActionImpl()
{
System.out.println("constructor[ActionIMPL]");
return;
}
@Override
public void perform()
{
System.out.println("perform method is called..");
return;
}
}
Звонящий
public final class MethodReferences
{
private final Action action;
public MethodReferences(Action action){this.action=action;return;}
public void execute(){System.out.println("execute->called");action.perform();System.out.println("execute->exist");return;}
public static void main(String[] args)
{
final MethodReferences clazz = new MethodReferences(new ActionImpl());
clazz.execute();
return;
}
}
если это называется, то выводится в вывод
constructor[ActionIMPL]
execute->called
perform method is called..
execute->exist
все в порядке, но если я использую ссылки на методы не perform message
метод напечатан это!! почему это я что-то упустил?
Если я использую этот код
final MethodReferences clazz = new MethodReferences(()->new ActionImpl());
clazz.execute();
Или этот код
final MethodReferences clazz = new MethodReferences(ActionImpl::new);
Это напечатано
execute->called
constructor[ActionIMPL]
execute->exist
Not exception or anything else is printed
Любая помощь очень ценна, которую я использую
Java 8 1.8.25 64 bits.
Обновить
Для парней, которые учатся, как я, это правильный бегущий код.
Я создал класс звонящего.
потому что мне нужно реализовать пустой метод perform from the Action functional interface
который мне нужно передать в качестве параметра в конструктор класса MethodReference
я ссылаюсь на конструктор MethodReferenceCall which is a empty constructor and i can use it.
public final class MethodReferenceCall
{
public MethodReferenceCall(){System.out.println("MethodReferenceCall class constructor called");}
public static void main(String[] args)
{
final MethodReferenceCall clazz = new MethodReferenceCall();
final MethodReferences constructorCaller = new MethodReferences(MethodReferenceCall::new);
constructorCaller.execute();
return;
}
}
Я надеюсь, что помогает кому-то наилучшими пожеланиями из Венесуэлы.
1 ответ
Это
final MethodReferences clazz = new MethodReferences(()->new ActionImpl());
не использует ссылку на метод, он использует лямбда-выражение. Функциональный интерфейс Action
"s
public void perform();
Так
()->new ActionImpl()
переводится в нечто похожее на
new Action() {
public void perform () {
new ActionImpl();
}
}
Точно так же в
final MethodReferences clazz = new MethodReferences(ActionImpl::new);
ActionImpl::new
который использует ссылку на конструктор, переводится в нечто вроде
new Action() {
public void perform () {
new ActionImpl();
}
}
это ActionImpl::new
не вызывает new ActionImpl()
, Он разрешает экземпляр ожидаемого типа, метод функционального интерфейса которого реализован как вызывающий этот конструктор.