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 '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>
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).
这不是一种仅对调用者应用重构的方法,但它可能会帮助您解决问题。
是否可以向您的项目添加一个MyContainer.java
与库中具有相同签名的假文件,应用您的重构,然后丢弃该 java 文件?您甚至可以使用反编译的源代码,尽管您可能必须自己对其进行泛化。
归档时间: |
|
查看次数: |
707 次 |
最近记录: |