我有一个库被更改为引入工厂方法来替换构造函数(原因现在并不重要,在目前的情况下,主要用于改进类型推断)。
假设 是一个Eclipse重构脚本(所以我几乎有一个很好的计算机可读的变化描述),有没有办法应用该脚本只有使用该库的项目(即它只引用了库的编译版本)?
例如,我从这个简单的类开始:
public class MyContainer<T> {
private final T content;
public MyContainer(final T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
现在我介绍一个工厂(没有将构造函数设为私有,但现在并不是真正相关),工厂方法如下所示:
public static <T> MyContainer<T> holding(T content) {
return new MyContainer<T>(content);
}
当我现在导出迁移脚本时,它看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<session version="1.0">
<refactoring comment="Introduce factory 'holding' in 'scratch.MyContainer' for constructor 'scratch.MyContainer.MyContainer()'
- Original project: 'scratch'
- Original element: 'scratch.MyContainer.MyContainer()'
- Factory name: 'holding'
- Owner class: 'scratch.MyContainer'"
description="Introduce factory for 'MyContainer'"
element1="/src<scratch{MyContainer.java[MyContainer"
flags="589830" id="org.eclipse.jdt.ui.introduce.factory"
input="/src<scratch{MyContainer.java"
name="holding" project="scratch" protect="false"
selection="89 0" version="1.0"/>
</session>
此 应保留足够的信息,以便通过jar文件将重构应用于引用该类(当前版本)的另一个项目。
但是尝试应用重构会给我这个错误:
无法执行refatoring'Introduce Factory'(org.eclipse.jdt.ui.introduce.factory),因为它的输入'scratch.MyContainer.java'不存在。
请注意,显式提及.java
,因此它正在寻找源文件,并不满足于将重构应用于二进制类型。
注意:我不想修补二进制库。我只是希望将原构造函数的调用者转换为调用工厂方法。
注2:搜索和替换在我的具体情况下无济于事。原因是我有两个构造函数,一个采用Object
而另一个采用String
。它们应该映射到两个不同的工厂方法,所以我需要搜索和替换函数来查看参数的类型信息。
注3:甚至可以通过调用此方法来手动指定“使用此构造函数替换对象X
的实例化”,这将是一种方法。
更新: Eclipse bugzilla上有一个关于adding a replace invocation refactoring的bugzilla条目。如果“调用”包括通过给定构造函数的对象实例化,则该功能的实现可能能够解决我的问题。不幸的是,它在过去几年中没有看到任何活动(虽然计划在3.2)。
答案 0 :(得分:1)
这不是仅将重构应用于调用者的方法,但它可能会让您解决问题。
是否可以向您的项目添加一个假的MyContainer.java
文件,该文件与库中的签名相同,应用您的重构然后丢弃java文件?您甚至可以使用反编译的源,但您可能必须自己进行生成。
答案 1 :(得分:1)
我认为你必须编写自己的重构插件。 org.eclipse.jdt.ui.tests.refactoring的tests是一个有趣的起点。
关于这个主题的一些有趣的读物: