Внедрение реализации интерфейса

1

Есть ли способ встроить реализацию интерфейса без его конструктора по умолчанию? Чтобы лучше понять мой вопрос, скажем, у меня есть интерфейс 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
        }
    };
  • 0
    Подождите, вы хотите анонимный класс ?
  • 2
    Анонимные внутренние классы могут получить доступ к конечным переменным их содержащей области. Вы можете сделать final String someString = ""; затем используйте someString внутри вашего второго примера кода
Показать ещё 1 комментарий
Теги:

2 ответа

2

Если ваш вопрос заключается в том, как сделать анонимный класс, который ссылается на объекты, которые вы создали в конструкторе, вы можете "встроить" реализацию, сделав анонимный класс и ссылающиеся 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.

0

Анонимные классы - это "старый" способ сделать это. Новый способ в Java 8 для интерфейса с одним способом состоит в использовании лямбда-выражений.

Например, скажем, вы хотели напечатать someString. Старый путь:

MyInterface o = new MyInterface() {
    @Override
    public void myFunction() {
        System.out.println(someString);
    }
};

новый путь:

MyInterface o = () -> System.out.println(someString);

Вам даже не нужно делать финал someString с лямбдами! Это достаточно хорошо, что оно "эффективно окончательно", что в основном означает, что оно могло быть выделено final и все еще составлено.

  • 0
    Да, Java 7 так в прошлом году!
  • 0
    Является ли возражение, что я упомянул новый способ, или то, что я описал старый способ как «старый» (с кавычками в оригинале и всем остальным!). Не то чтобы я называл анонимные классы устаревшими .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню