当前位置: 首页 > 面试题库 >

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

萧卜霸
2023-03-14
问题内容

有时,我创建一个装饰器类,如下所示:

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具有用于生成委托方法的“生成”选项。创建一个新类:

public class MyDecoratorClass {
    private MyInterfaceWithManyMethods myInterface;
}

然后标记myInterface,转到“菜单”>“代码”>“委托方法”,选择要包装的所有方法,仅此而已。

//更新结束

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

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

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

按Alt + Enter,选择“实现接口”,为装饰器命名,例如“ MyDecorator”。这给你

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

在新类中,选择类名称,然后选择“重构”->“用委派替换继承”,选择您的界面,勾选所有方法名称,然后按Enter。你会得到:

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



 类似资料:
  • 有什么方法可以为我创建的类使用自动装箱吗?例如,我有的子类。 现在,< code > UnsignedInteger I = new UnsignedInteger(88);工作得非常好,但是有什么方法可以让这个编译:< code > UnsignedInteger i = 88?对我来说不会。提前感谢!

  • 问题内容: 有什么方法可以对我创建的类使用自动装箱吗?例如,我有的子类。 现在,工作完全正常,但有什么办法,使这个编译:?不会适合我的 提前致谢! 问题答案: 简而言之,没有。没有办法将其编译。 Java仅定义了一组有限的预定义拳击转换。 在JLS中,第5.1.7节: 装箱转换将原始类型的表达式转换为引用类型的对应表达式。具体来说,以下九种转换称为装箱转换: 从布尔类型到布尔类型 从字节类型到字节

  • 问题内容: 我希望能够创建一个python装饰器,该装饰器会在全局存储库(具有某些属性)中自动“注册”类方法。 示例代码: 我希望加载完成后,某处将包含以下内容: 这可能吗? 问题答案: 不只是装饰,不。但是,元类可以在创建类后自动使用它。如果您的装饰器仅记录了元类应该做什么,则可以执行以下操作: 印刷

  • 本文向大家介绍aurelia 使用@customElement装饰器创建自定义元素,包括了aurelia 使用@customElement装饰器创建自定义元素的使用技巧和注意事项,需要的朋友参考一下 示例 在大多数示例中,类命名约定用于定义Aurelia自定义元素。但是,Aurelia还提供了可用于装饰类的装饰器。然后,该类再次被Aurelia视为自定义元素。 提供给装饰器的值将成为自定义HTML

  • 这看起来很奇怪,因为可以自动生成这些迁移(例如,像django一样),而且令人惊讶的是,V1的create-commands是自动生成的,但是如果我以后添加一个表,我必须手动键入命令。 那么,我是错过了它,还是我真的必须编写迁移?