是否有一系列IntelliJ自动重构可以摆脱多余的类Foo?
重构之前:
public static class Foo {
private final String s;
public Foo(String s) {
this.s = s;
}
public String getS() {
return s;
}
}
private static void run() {
Foo f = new Foo("blah");
f.getS().length();
f.getS().getBytes();
Foo f2 = new Foo("blahg");
f2.getS().length();
f2.getS().getBytes();
}
重构后:
private static void run() {
String f = "blah";
f.length();
f.getBytes();
String f2 = new "blahg";
f2.length();
f2.getBytes();
}
在我的特定情况下进行自动重构的原因是现实生活中的Foo被使用了几千次。但我也只是感兴趣。使用其他自动化步骤将代理对象获取到 Foo 状态非常容易,但我只是不知道如何进行最后一点。
不确定这在更通用的设置中如何工作,但我会:
-
重构
Foo
将getS
的名称更改为非常不同的名称,例如XXXXXXXXX
-
字符串将
.XXXXXXXXX()
替换为空字符串 -
正则表达式字符串将
Foo (w+) = new Foo("(w+)");
替换为String $1 = "$2"
;
这将处理run
方法中的所有内容。现在你只需要手动删除Foo
,虽然它不是 IntelliJ 重构,但它只需要在一个地方完成,所以可能是可以接受的。
一个更安全的方法是使用结构替换
- 在菜单中搜索结构替换
- 在搜索框中键入
$Instance$.getS().$MethodCall$($Parameter$)
- 在 $Instance$ 上添加一个过滤器,使其仅是 Foo 的实例
- 替换为:
$Instance$.getS().$MethodCall$($Parameter$)
- 在此之后,您可以继续使用结构替换并找到所有实例,并替换它们,但运行
Migrate
并创建从类Foo
到"字符串"的自定义类型映射更容易 - 如果你想再次使用结构替换,你可以使用这样的东西来查找和替换
Foo $name$ = new Foo($Parameter$);
String $name$ = $Parameter$;