Ссылки на методы конструктора 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(), Он разрешает экземпляр ожидаемого типа, метод функционального интерфейса которого реализован как вызывающий этот конструктор.

Другие вопросы по тегам