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可以自动为我创建这个课程吗?

更新//

我注意到IntelliJ有一个“Generate”选项用于生成委托方法。 创建一个新类:

 public class MyDecoratorClass { private MyInterfaceWithManyMethods myInterface; } 

然后标记myInterface,转到菜单>代码>委托方法,选择要包装的所有方法,就是这样。

//更新结束

您可以尝试“重构” – >“用委托替换inheritance”重构。 它应该能够像这样做。 我称之为“使用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() { } } 

在新类中,选择类名,然后选择“重构” – >“用委托替换inheritance”,选择您的界面,勾选所有方法名称,按回车键。 你会得到:

 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

你也许可以添加一个文件模板,如:

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

然后,当您使用此模板创建文件时,只需使用Alt + Inser和选择委托方法。 它并不完美,但这可能是一条捷径