猿问

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


爪哇intellij-idea重构自动重构


月关宝盒
浏览 84回答 2
2回答

慕神8447489

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

慕仙森

更安全的方法是使用结构替换在菜单中搜索结构替换$Instance$.getS().$MethodCall$($Parameter$)在搜索框中输入在 $Instance$ 上添加一个过滤器,使其仅成为 Foo 的实例用。。。来代替:$Instance$.getS().$MethodCall$($Parameter$)之后,您可以继续进行结构替换并查找所有实例,然后替换它们,但运行并创建从类到“String”的Migrate自定义类型映射会更容易Foo如果您想再次使用结构替换,您可以使用类似的内容进行查找和替换Foo $name$ = new Foo($Parameter$);String $name$ = $Parameter$;
随时随地看视频慕课网APP

相关分类

Java
我要回答