如何跨文件提取方法?

在我项目的所有java文件中,我想替换以下实例:

myObject.getName() == null

有了这个:

myObject.hasName()

是否有任何行动或策略来做到这一点 IntelliJ IDEA?

  • 我希望它特定于我的类的方法,而不是替换代码,代码指的是其他类调用的方法。getNameMyClassgetName
  • 我希望它能找到尽可能多的匹配项。它不应该关心额外的空格,换行符等。如果变量有另一个名称(如或),它也应该有效。还应该找到类似的呼叫。(搜索必须关心语义)。myObjobjXgetObject().getName()
  • 我希望它很快,而不是要求我一个接一个地经历数百场比赛。

答案 1

使用结构搜索和替换(编辑|查找|替换结构上...),它是为这样的用例设计的。

使用搜索模板:

$x$.getName() == null

替换模板:

$x$.hasName()

单击编辑变量...“按钮,并将表达式类型(正则表达式)指定为 。搜索时,这也将找到您的示例MyClassgetObject().getName() == null


答案 2

使用查找和替换代码重复项

  1. 创建实例方法:

    public boolean hasName() {
        return getName() == null;
    }
    
    • 为此,我建议选择 ,然后使用操作重构|提取|方法。。。重构|移动...,因此您不必键入任何代码。myObject.getName() == null
  2. 单击该方法并使用重构|查找和替换代码重复项

    • 但是,它不会重构如下用法:

      String name = myObject.getName();
      if (name == null) {
          ...
      }
      
    • 您还可以在非实例方法上执行此操作:

      private boolean hasName(MyClass myObject) {
          return myObject.getName() == null;
      }
      

      这将导致使方法成为静态的,然后使用重构|转换为实例方法。同样的结果。


推荐