【问题标题】:Can IntelliJ automatically create a decorator class?IntelliJ 可以自动创建装饰器类吗?
【发布时间】:2011-05-18 13:31:13
【问题描述】:

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

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

【问题讨论】:

    标签: java intellij-idea design-patterns decorator


    【解决方案1】:

    更新//

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

    public class MyDecoratorClass {
        private MyInterfaceWithManyMethods myInterface;
    }
    

    然后标记 myInterface,转到 Menu > Code > Delegate Methods,选择所有要包装的方法,就是这样。

    //更新结束

    您可以尝试“重构”->“用委托替换继承”重构。它应该能够做到这一点,就像这样。我称之为“使用 Alt+Enter 的代码”

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

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

    按 Alt+Enter,选择“Implement Interface”,为您的装饰器命名,如“MyDecorator”。这给了你

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

    在新类中,选择类名,然后“重构”->“用委托替换继承”,选择你的接口,勾选所有方法名,回车。你会得到:

    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 的完整答案:)。我写了一个文件模板,因为当模板创建时,你只需要创建文件,然后只有一个“Alt+Inser”。创建时间应该与您的解决方案几乎相同,但键盘操作更少。
    • 从至少 Intellij 8 开始生成代表。
    【解决方案2】:

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

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

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

    【讨论】:

    • 不错,但如果它还可以生成要实现的方法(委托对委托对象的调用),那就太好了。
    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多