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

Posted

技术标签:

【中文标题】IntelliJ 可以自动创建装饰器类吗?【英文标题】:Can IntelliJ automatically create a decorator class? 【发布时间】: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 可以自动为我创建这个类吗?

【问题讨论】:

【参考方案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 和选择委托方法。 它并不完美,但这可能是一个捷径

【讨论】:

不错,但如果它还可以生成要实现的方法(委托对委托对象的调用),那就太好了。

以上是关于IntelliJ 可以自动创建装饰器类吗?的主要内容,如果未能解决你的问题,请参考以下文章

装饰器、装饰器类与类装饰器(三)

在 python memoization 装饰器类中设置 get/set 属性

字符串装饰器类导致大量构建错误

IntelliJ IDEA - 创建文件自动 Add 到 Git 选项配置

Python__new__方法定制属性访问描述符与装饰器

IntelliJ IDEA 创建动态的JavaWeb工程