Ответ 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