Чтобы сослаться (с помощью функционального интерфейса) на конструктор нужно использовать ключевое слово new.
ClassName::new
Обратите внимание на тип переменной, в которую мы можем захотеть сохранить получившийся конструктор.
Предположим у нас конструктор получает String в параметрах. И сразу выводит в консоль этот текст.
public Main8(String name) {
System.out.println("Hello " + name);
}
Так как у нас конструктор получает String name
на вход, а на выходе выдает экземпляр класса (в нашем случае класса Main8
), то и тип переменной должен быть Function<String, Main8>
.
И у нас получится такое присвоение
Function<String, Main8> main8Constructor1 = Main8::new;
Или мы можем придумать свой функциональный интерфейс, скажем такой
interface StringToMain8{
Main8 getMessage(String msg);
}
Раз он функциональный, то в в нем должен быть только один метод с любым названием. Принимать метод должен String
, а возвращать Main8
И присвоение будет таким
StringToMain8 main8Constructor2 = Main8::new;
Вызвать конструктор и создать экземпляр класса тогда можно так
main8Constructor1.apply("Valdemar");
main8Constructor2.getMessage("Valdemar");
А весь код таким
import java.util.function.Function;
public class Main8 {
interface StringToMain8{
Main8 getMessage(String msg);
}
public Main8(String name) {
System.out.println("Hello " + name);
}
public static void main(String[] args) {
Function<String, Main8> main8Constructor1 = Main8::new;
StringToMain8 main8Constructor2 = Main8::new;
main8Constructor1.apply("Valdemar");
main8Constructor2.getMessage("Valdemar");
}
}