有时,我会创建一个这样的装饰器类:
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可以自动为我创建这个课程吗?
答案 0 :(得分:39)
<强>更新//
我注意到IntelliJ有一个“Generate”选项用于生成委托方法。创建一个新类:
public class MyDecoratorClass {
private MyInterfaceWithManyMethods myInterface;
}
然后标记myInterface,转到菜单&gt;代码&gt;委托方法,选择你想要包装的所有方法,就是这样。
//更新结束
您可以尝试“重构” - &gt; “用委托替换继承”重构。它应该能够像这样做。我称之为“使用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() {
}
}
在新班级中,选择班级名称,然后选择“重构” - &gt; “用委托替换继承”,选择你的界面,勾选所有方法名称,按回车键。你会得到:
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
答案 1 :(得分:1)
您可以添加如下文件模板:
class ${NAME} implements ${INTERFACE} {
private final ${INTERFACE} delegate;
public ${NAME}(final ${INTERFACE} delegate) {
this.delegate = delegate;
}
然后当您使用此模板创建文件时,只需使用 Alt + Inser和选择委托方法。 它并不完美,但这可能是一条捷径