Может ли IntelliJ автоматически создавать класс декоратора?

Иногда я создаю класс декоратора следующим образом:

class MyInterfaceDecorator implements MyInterface {
   private final MyInterface delegate;
   ... constructor taking a MyInterface instance ...

   @Override
   public Object someInterfaceMethod(Some argument) {
       return delegate.someInterfaceMethod(argument);
   }

   ... etc, more methods here...
}

Может ли IntelliJ автоматически создать для меня этот класс?

Ответы

Ответ 1

Update//

Я заметил, что IntelliJ имеет параметр "Generate" для генерации методов делегатов. Создайте новый класс:

public class MyDecoratorClass {
    private MyInterfaceWithManyMethods myInterface;
}

Затем пометьте myInterface, перейдите в Меню > Код > Делегировать методы, выберите все методы, которые вы хотите обернуть, и что он.

//Конец обновления

Вы можете попробовать рефакторинг "Рефакторинг" → "Заменить наследование с делегированием". Он должен уметь это делать, как это. Я называю этот "Код с помощью Alt + Enter"

Перейдите в интерфейс, для которого вы хотите создать декоратор.

public interface MyInterfaceWithManyMethods {
    void method1();
    void method2();
    void method3();
}

Нажмите Alt + Enter, выберите "Интерфейс реализации", введите имя своего Decorator, например "MyDecorator". Это дает вам

public class MyDecorator implements MyInterfaceWithManyMethods {
    public void method1() {
    }
    public void method2() {
    }
    public void method3() {
    }
}

В новом классе выберите имя класса, затем "Рефакторинг" → "Заменить наследование с делегированием", выберите свой интерфейс, отметьте все имена методов, нажмите enter. Вы получите:

public class MyDecorator {

    private final MyObject object = new MyObject();

    public void method1() {
        object.method1();
    }

    public void method2() {
        object.method2();
    }

    public void method3() {
        object.method3();
    }

    private class MyObject implements MyInterfaceWithManyMethods {
        public void method1() {

        }

        public void method2() {

        }

        public void method3() {

        }
    }
}

Удалите внутренний класс и инициализатор объекта вручную. Вы получаете:

public class MyDecorator {


    public void method1() {
        object.method1();
    }

    public void method2() {
        object.method2();
    }

    public void method3() {
        object.method3();
    }

}

Нажмите Alt + Enter на "объекте", который теперь отмечен красным, выберите "Создать поле", выберите "MyInterfaceWithManyMethods".

public class MyDecorator {


    private MyInterfaceWithManyMethods object;

    public void method1() {
        object.method1();
    }

    public void method2() {
        object.method2();
    }

    public void method3() {
        object.method3();
    }

}

Выберите переменную объекта, нажмите Alt + Enter, выберите "Добавить параметр конструктора":

public class MyDecorator {


    private MyInterfaceWithManyMethods object;

    public MyDecorator(MyInterfaceWithManyMethods object) {
        this.object = object;
    }

    public void method1() {
        object.method1();
    }

    public void method2() {
        object.method2();
    }

    public void method3() {
        object.method3();
    }

}

Вы видите, что все это сделано несколькими штрихами Alt + Enter. Читает как много работы, но это можно сделать менее чем за 20 секунд. Если у вас есть только 2 или 3 метода, вы можете быть быстрее с живым шаблоном, однако, если у вас много методов со сложными сигнатурами, вы получите рабочий результат примерно за 20 секунд с помощью этого метода. Alt + Enter просто скалы: D

Ответ 2

Возможно, вы можете добавить шаблон файла, например:

class ${NAME} implements ${INTERFACE} {
   private final ${INTERFACE} delegate;

   public ${NAME}(final ${INTERFACE} delegate) {
       this.delegate = delegate;
}

а затем, когда вы создали файл с помощью этого шаблона, просто используйте Методы делегатов Alt + Inser и выбора. Это не идеально, но это может быть ярлык