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

2024-06-19

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

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


Update//

我注意到 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IntelliJ可以自动创建装饰器类吗? 的相关文章

随机推荐

  • 如何在 Process.Start 上使用 Microsoft Fakes 程序集

    我想嘲笑系统 诊断 进程 启动调用 所以我为System集会 问题是Start是一个静态方法系统 诊断 过程所以我没有得到一个能够为 Start 方法挂钩委托的垫片 这样做的正确方法是什么 因此 首先您需要为 Process 类生成 Shi
  • 图像下方不需要的边距

    我有一个图像和一个 div 我想将其放置在其下方 这是小提琴 http jsfiddle net d3Mne 1 http jsfiddle net d3Mne 1 问题是两者之间存在差距 此下边距仅出现在图像中 有什么办法可以去除吗 Se
  • Excel 接受一些字符,而 OpenXml 有错误

    我有一个字符串 我想使用 C 中的 openxml 组件将其导出到 Excel 文件 我的文本有 u001f 字符 而 openxml 对此字符有错误 错误文本 十六进制值 0x1f 是无效字符 我将该测试直接复制到 Excel 中 没有问
  • 部分预处理 C 或 C++ 源文件?

    有没有办法部分预处理C或者C 源文件 我所说的 部分预处理 是指扩展一些但不是全部的 include 指令 例如 我想扩展 includes 指向我的项目标头 但不扩展 includes 指向其他库的标头 我尝试通过运行来做到这一点gcc
  • Electron webContentsexecuteJavaScript:无法在 loadURL 上第二个执行脚本

    我正在测试 Electron 特别是使用executeJavaScript 我的项目使用 POST 请求登录网站 然后执行一些工作并使用同一会话加载第二个 URL 在第二个 URL 中 我需要执行 JS 但我不确定我做错了什么 在此示例中
  • 需要按天分割日期时间范围

    我有一个需要根据日期时间拆分的表 输入表 ID Start End A 2019 03 04 23 18 04 2019 03 04 23 21 25 A 2019 03 04 23 45 05 2019 03 05 00 15 14 所需
  • 在哪里实现 Swift 协议?

    在 Swift 中实现协议一致性时 我有两个选择 具有相同的最终结果 在类中实现协议 也就是说 在类定义的顶部声明一致性 并将实现放在类体内 或者 在扩展中实现协议 也就是说 完全在类之外编写符合协议的代码 这是一个例子 public cl
  • 如何定义与更高类型类型(类型构造函数)绑定的上下文

    我尝试过以下方法 def test Option T Ordering value1 Option T value2 Option T val e implicitly Ordering Option T compare value1 va
  • 在 Delphi 中的 SOAP 标头中发送简单字符串

    我需要发送这样的东西
  • 为什么这个符号链接创建了两个实例

    我有一个用于我的点文件的安装脚本 我用来创建一个目录到我的主文件夹的符号链接 这些链接执行得很好 但创建了第二个符号链接 我无法解释为什么 项目中的文件夹结构如下所示 install sh scripts shell sh shell in
  • AWS ELB 和 GoDaddy 域正在运行

    我已在 goDaddy com 中注册了一个域 并希望将流量发送到 AWS Route53 我创建了一个 ELB 我执行了以下步骤 在 Route 53 中 为我的 godaddy 域名创建一个托管区域 这反过来又为我提供了一条包含 4 个
  • 找不到 OAuth2 参数

    我正在尝试使用 OAuth 2 0 来授权 google docs API 根据谷歌给出的例子https developers google com google apps documents list authorizing reques
  • Python Scrapy:“runspider”和“crawl”命令有什么区别?

    有人可以解释一下两者之间的区别吗运行蜘蛛 and crawl命令 应该在什么情况下使用它们 在命令中 scrapy crawl options
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • Matplotlib xlabel Arial 格式,其中一个单词为斜体

    我想创建一个 matplotlib 图形 其 x 轴标签采用 Arial 字体 并且有一个斜体字 我可以用乳胶字体创建带有 x 轴标签的图形 其中一个单词为斜体 我还可以在 Arial 中创建带有 x 轴标签的图形 只要我将整个标签设置为斜
  • pyplot 中的等宽绘图大小,同时保持纵横比相等

    我想让两个图具有相同的宽度 但是生成的代码缩小了 imshow 图 xx np linspace 0 0 255 5 512 yy np linspace 0 0 255 5 512 Func np random rand len xx l
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 为什么我需要 Nginx 和 Puma?

    我正在将 Rails 应用程序部署到生产环境中 看起来 Puma 速度很快 可以处理我想要在网络服务器中完成的许多事情 我想知道我是否需要使用 Nginx 如果只使用 Puma 我会错过什么 Nginx 是一个 Web 服务器 puma 是
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • IntelliJ可以自动创建装饰器类吗?

    有时 我创建一个像这样的装饰器类 class MyInterfaceDecorator implements MyInterface private final MyInterface delegate constructor taking