Есть ли способ встроить реализацию интерфейса без его конструктора по умолчанию? Чтобы лучше понять мой вопрос, скажем, у меня есть интерфейс MyInterface и одна его реализация называется MyImplementation.
public interface MyInterface
{
void myFunction();
}
public MyImplementation implements MyInterface
{
private final String someString;
public MyImplementation(String someString)
{
this.someString = someString;
}
public void myFunction()
{
// do something.
}
}
Есть ли способ встроить MyImplementation? Если бы мне не пришлось передавать someString в конструктор реализации, я мог бы просто сказать:
MyInterface myInterface = new MyInterface() {
public void myFunction()
{
// do something
}
};
Если ваш вопрос заключается в том, как сделать анонимный класс, который ссылается на объекты, которые вы создали в конструкторе, вы можете "встроить" реализацию, сделав анонимный класс и ссылающиеся final
локальные переменные, определенные в том же методе, например:
private final String someString = ...; // That the string that you used to init in the constructor; init it here
MyInterface myInterface = new MyInterface() { // That the code that you wanted to have
public void myFunction()
{
System.out.println(someString); // This is allowed, because someString is final
}
};
За сценой Java-компилятор сгенерировал класс, который очень похож на ваш класс MyImplementation
, MyImplementation
конструктор, похожий на ваш конструктор MyImplementation
, и передаст ему someString
.
Анонимные классы - это "старый" способ сделать это. Новый способ в Java 8 для интерфейса с одним способом состоит в использовании лямбда-выражений.
Например, скажем, вы хотели напечатать someString
. Старый путь:
MyInterface o = new MyInterface() {
@Override
public void myFunction() {
System.out.println(someString);
}
};
новый путь:
MyInterface o = () -> System.out.println(someString);
Вам даже не нужно делать финал someString
с лямбдами! Это достаточно хорошо, что оно "эффективно окончательно", что в основном означает, что оно могло быть выделено final
и все еще составлено.
final String someString = "";
затем используйтеsomeString
внутри вашего второго примера кода