IntelliJ 重构为内联冗余数据类



是否有一系列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 状态非常容易,但我只是不知道如何进行最后一点。

不确定这在更通用的设置中如何工作,但我会:

  • 重构FoogetS的名称更改为非常不同的名称,例如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$;

最新更新