有没有办法为其副作用应用重构脚本?

Joa*_*uer 12 java eclipse refactoring automation

我有一个库被更改为引入工厂方法来替换构造函数(原因现在并不重要,在目前的情况下,它主要用于改进类型推断).

假设有它一个Eclipse重构脚本(所以我非常有变化的一个很好的计算机可读的描述),是有一些方法可以适用该脚本,只有一个项目,使用该库(即只具有参考到库的编译版本)?

例如,我从这个简单的类开始:

public class MyContainer<T> {
    private final T content;

    public MyContainer(final T content) {
        this.content = content;
    }

    public T getContent() {
        return content;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我介绍一个工厂(没有使构造函数私有,但现在这不是真正相关),工厂方法如下所示:

public static <T> MyContainer<T> holding(T content) {
    return new MyContainer<T>(content);
}
Run Code Online (Sandbox Code Playgroud)

当我现在导出迁移脚本时,它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<session version="1.0">
<refactoring comment="Introduce factory &apos;holding&apos; in &apos;scratch.MyContainer&apos; for constructor &apos;scratch.MyContainer.MyContainer()&apos;&#x0A;- Original project: &apos;scratch&apos;&#x0A;- Original element: &apos;scratch.MyContainer.MyContainer()&apos;&#x0A;- Factory name: &apos;holding&apos;&#x0A;- Owner class: &apos;scratch.MyContainer&apos;"
             description="Introduce factory for &apos;MyContainer&apos;"
             element1="/src&lt;scratch{MyContainer.java[MyContainer"
             flags="589830" id="org.eclipse.jdt.ui.introduce.factory"
             input="/src&lt;scratch{MyContainer.java"
             name="holding" project="scratch" protect="false"
             selection="89 0" version="1.0"/>
</session>
Run Code Online (Sandbox Code Playgroud)

应该包含足够的信息以将重构应用于另一个通过jar文件引用类(当前版本)的项目.

但是尝试应用重构会给我这个错误:

无法执行refatoring'Introduce Factory'(org.eclipse.jdt.ui.introduce.factory),因为它的输入'scratch.MyContainer.java'不存在.

请注意,它明确提到.java,因此它正在寻找源文件,并不满足于将重构应用于二进制类型.

注:并不想修补的二进制库.我只想将原始构造函数的调用者转换为调用工厂方法.

注意2:在我的具体情况下,搜索和替换将无济于事.原因是我有两个构造函数,一个取一个Object,另一个取一个String.它们应该映射到两个不同的工厂方法,所以我需要搜索和替换函数来查看参数的类型信息.

注3:即使是一种手动指定" X用此构造函数替换对象的实例化而不是调用此方法"的方法也是值得赞赏的.

更新: Eclipse bugzilla上有一个关于添加替换调用重构的bugzilla条目.如果"调用"包括通过给定构造函数的对象实例化,那么该功能的实现可能能够解决我的问题.不幸的是,它在过去几年没有看到任何活动(尽管计划在3.2).

Mis*_*ble 1

这不是一种仅对调用者应用重构的方法,但它可能会帮助您解决问题。

是否可以向您的项目添加一个MyContainer.java与库中具有相同签名的假文件,应用您的重构,然后丢弃该 java 文件?您甚至可以使用反编译的源代码,尽管您可能必须自己对其进行泛化。