为了账号安全,请及时绑定邮箱和手机立即绑定

IntelliJ 重构为内联冗余数据类

IntelliJ 重构为内联冗余数据类

月关宝盒 2023-09-27 10:28:10
是否有一系列 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 重构,但它只需要在一个地方完成,因此可能是可以接受的。


查看完整回答
反对 回复 2023-09-27
?
慕仙森

TA贡献1827条经验 获得超7个赞

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

  • 在菜单中搜索结构替换

  • $Instance$.getS().$MethodCall$($Parameter$)在搜索框中输入

  • 在 $Instance$ 上添加一个过滤器,使其仅成为 Foo 的实例

  • 用。。。来代替:$Instance$.getS().$MethodCall$($Parameter$)

  • 之后,您可以继续进行结构替换并查找所有实例,然后替换它们,但运行并创建从类到“String”的Migrate自定义类型映射会更容易Foo

  • 如果您想再次使用结构替换,您可以使用类似的内容进行查找和替换

    • Foo $name$ = new Foo($Parameter$);

    • String $name$ = $Parameter$;


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 55 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信