java - 自动将继承转换为委托(delegate)

标签 java intellij-idea

Automated delegation in Java

在上面的链接中,用户提出了类似的问题,但给出的答案需要使用反射。

我的问题是是否有一个重构工具可以自动为每个委托(delegate)类生成所有的单行方法。

Intellij 提供了一个“用委托(delegate)替换继承”工具,但它不能正确完成工作 - 当我使用它时,它会创建一大堆重复方法和其他奇怪的行为,这使得它比实际手动执行更糟糕(我认为这是因为它尝试委托(delegate)的多个接口(interface)相互冲突并造成困惑。

我做错了吗,或者这可能是 IntelliJ 中的错误或限制?

我可以使用任何解决方法来代替花费时间复制粘贴代码吗?

编辑:

我已将问题隔离如下(当然每个类都在单独的文件中):

class TestClass extends MyClass {
    void function() {}
}
class MyClass extends MyAbstractClass implements MyInterface {
    @Override
    void function() {}
}
abstract class MyAbstractClass {
    abstract void function();
}
interface MyInterface {
    void function();
}

现在,如果我在 TestClass 上使用“Replace Inheritance With Delegation”,我会得到以下结果:

class TestClass implements MyInterface {
    private final MyMyClass myClass = new MyMyClass();

    void function() {
        myClass.function();
    }

    void function() {
        myClass.function();
    }

    private class MyMyClass extends MyClass {
        void function() {}
    }
}

所以 function() 出现了两次,我相信这不应该出现,因为代码自然不能用具有相同签名的两个函数进行编译,迫使我手动删除其中一个,这对于具有许多相同函数的实际类来说是乏味的签名

例如尝试使用 MyClass<E> extends HashSet<E>看看它变得多么困惑。我可以选择要委托(delegate)的特定函数,并确保我不会只选择 1 个具有相同签名的方法,但这使得整个重构变得毫无意义 - 对我来说,自己编写转发函数会更快...

最佳答案

生成一个覆盖所有方法的子类,然后将 super. 替换为 delegate.。有些 IDE 甚至有此选项。

关于java - 自动将继承转换为委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36408673/

相关文章:

java - Dropbox api 获取以前的文件版本预览 url

apache-spark - Kotlin:get(路径:......) Unresolved reference :路径

java - ASM 字节码 View 显示 "//couldn' t generate bytecode view, no .class file found”

java - 使用 IntelliJ 删除源文件注释?

java - 如何在超过限制时打印 Java int 值

java - HTML WebView 上使用键盘时如何隐藏 ImageView

groovy - Groovy 中的 Logback 配置以及 Gradle/Idea 中的不同类路径

java - 将 Intellij 中的项目与 checkin subversion 的项目进行比较?

java - 为什么C、C++、Java不用一补?

java - 从 map 中检索对象