我有一个库,它被更改以引入工厂方法来替换构造函数(原因目前并不重要,在当前情况下,这主要是为了改进类型推断)。
假设有适用于该库的Eclipse重构脚本(因此我基本上拥有一个良好的计算机可读的描述),那么是否有某种方法可以将该脚本应用于仅使用该库的项目(即它只引用编译版本的库)?
例如,我从这个简单的类开始:
现在我介绍一个工厂(不将构造函数设为私有,但这并不是现在要讨论的问题),该工厂方法如下:
当我现在导出一个迁移脚本时,它看起来像这样:
假设有适用于该库的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 文件的 当前 版本)的另一个项目中。
但是尝试应用重构时会出现以下错误:
重构 "Introduce Factory" (org.eclipse.jdt.ui.introduce.factory) 无法执行,因为它的输入 "scratch.MyContainer.java" 不存在。
请注意,它 明确地 提到了 .java
,因此它正在寻找源文件,并且不能仅对二进制类型应用重构。
注意: 我不想修改二进制库。我只想将原始构造函数的 调用者 转换为调用工厂方法。
注意2: 在我的特定情况下,搜索和替换无法解决问题。原因是我有 两个 构造函数,一个接受 Object
,另一个接受 String
。它们应映射到两个 不同的 工厂方法,因此我需要搜索和替换函数还要查看参数的类型信息。
注意3: 即使手动指定“用这个构造函数的实例化替换对象 X
的调用为对此方法的调用”也会受到赞赏。
更新: 在 Eclipse bugzilla 上有一个关于 添加替换调用重构的bugzilla入口。 如果“调用”包括通过给定构造函数实例化对象,那么该功能的实现可能能够解决我的问题。不幸的是,它在过去几年中没有任何活动(尽管它计划用于 3.2 版本)。
Object
,另一个接受String
。它们将映射到两个不同的工厂方法(为了更好的可读性)。因此,在我的搜索和替换功能中,我需要类型信息。 - Joachim Sauer