是否有一系列 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 的状态非常容易,但我只是不知道如何进行最后一点。爪哇intellij-idea重构自动重构
2 回答

慕神8447489
TA贡献1780条经验 获得超1个赞
不确定这在更通用的设置中如何工作,但我会:
重构
Foo
以将名称更改getS
为非常独特的名称,例如XXXXXXXXX
字符串替换
.XXXXXXXXX()
为空字符串正则表达式 stringn 替换
Foo (\w+) = new Foo\("(\w+)"\);
为String $1 = "$2"
;
这将处理该run
方法中的所有内容。现在您只需要手动删除Foo
,虽然这不是 IntelliJ 重构,但它只需要在一个地方完成,因此可能是可以接受的。

慕仙森
TA贡献1827条经验 获得超8个赞
更安全的方法是使用结构替换
在菜单中搜索结构替换
$Instance$.getS().$MethodCall$($Parameter$)
在搜索框中输入在 $Instance$ 上添加一个过滤器,使其仅成为 Foo 的实例
用。。。来代替:
$Instance$.getS().$MethodCall$($Parameter$)
之后,您可以继续进行结构替换并查找所有实例,然后替换它们,但运行并创建从类到“String”的
Migrate
自定义类型映射会更容易Foo
如果您想再次使用结构替换,您可以使用类似的内容进行查找和替换
Foo $name$ = new Foo($Parameter$);
String $name$ = $Parameter$;
添加回答
举报
0/150
提交
取消