IntelliJ可以自动创建装饰器类吗?

dav*_*veb 20 java design-patterns decorator intellij-idea

有时,我创建一个这样的装饰器类:

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...
}
Run Code Online (Sandbox Code Playgroud)

IntelliJ可以自动为我创建这个课程吗?

Jan*_*omä 41

更新//

我注意到IntelliJ有一个"生成"选项,用于生成委托方法.创建一个新类:

public class MyDecoratorClass {
    private MyInterfaceWithManyMethods myInterface;
}
Run Code Online (Sandbox Code Playgroud)

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

//更新结束

您可以尝试"重构" - >"用委托替换继承"重构.它应该能够像这样做.我称之为"使用Alt + Enter的代码"

转到要为其生成装饰器的界面.

public interface MyInterfaceWithManyMethods {
    void method1();
    void method2();
    void method3();
}
Run Code Online (Sandbox Code Playgroud)

按Alt + Enter,选择"实施界面",为您的Decorator命名,如"MyDecorator".这给了你

public class MyDecorator implements MyInterfaceWithManyMethods {
    public void method1() {
    }
    public void method2() {
    }
    public void method3() {
    }
}
Run Code Online (Sandbox Code Playgroud)

在新类中,选择类名,然后选择"重构" - >"用委托替换继承",选择您的界面,勾选所有方法名称,按回车键.你会得到:

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() {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

手动删除内部类和对象初始值设定项.你得到:

public class MyDecorator {


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

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

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

}
Run Code Online (Sandbox Code Playgroud)

在"对象"上按Alt + Enter,现在标记为红色,选择"创建字段",选择MyInterfaceWithManyMethods.

public class MyDecorator {


    private MyInterfaceWithManyMethods object;

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

选择对象变量,按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();
    }

}
Run Code Online (Sandbox Code Playgroud)

你看到它完成了几笔Alt + Enter.读起来像很多工作,但它可以在不到20秒的时间内完成.如果您只有2或3种方法,使用实时模板可能会更快,但是如果您有许多具有复杂签名的方法,则使用此方法可以在大约20秒内获得工作结果.Alt + Enter只是摇滚:D

  • 我为你添加了完整的描述. (2认同)