IntelliJ 重构以内联冗余数据 class

IntelliJ refactoring to inline redundant data class

是否有一系列 IntelliJ 自动重构可以摆脱多余的 class 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()

  • 正则表达式 stringn 将 Foo (\w+) = new Foo\("(\w+)"\); 替换为 String = "";

这将处理 run 方法中的所有内容。现在你只需要手动删除 Foo,虽然它不是 IntelliJ 重构,但它只需要在一个地方完成,所以可能是可以接受的。

更安全的方法是使用结构替换

  • 在菜单中搜索结构替换
  • 在搜索框中输入 $Instance$.getS().$MethodCall$($Parameter$)
  • 在 $Instance$ 上添加一个过滤器,使其仅是 Foo 的实例
  • 替换为:$Instance$.getS().$MethodCall$($Parameter$)
  • 在此之后您可以继续进行结构替换并找到所有实例并替换它们,但只 运行 Migrate 并从 class [= 创建自定义类型映射更容易13=] 到“字符串”
  • 如果你想再次使用结构替换,你可以使用类似这样的东西来查找和替换
    • Foo $name$ = new Foo($Parameter$);
    • String $name$ = $Parameter$;