如何跨文件提取方法?

时间:2017-04-18 12:28:09

标签: java intellij-idea refactoring structural-search

在我项目的所有java文件中,我想替换出现的:

myObject.getName() == null

有了这个:

myObject.hasName()

IntelliJ IDEA是否有任何行动或策略?

  • 我希望它对我的班级getName的{​​{1}}方法具体而不是替换代码,它引用其他名为MyClass的方法类。
  • 我希望它尽可能找到很多匹配。它不应该关心额外的空格,换行符等。如果变量有另一个名称(如getNamemyObj),它也应该有效。还应找到objX之类的通话。 (搜索必须关注语义)。
  • 我希望它能够快速,而不是要求我逐一完成数百场比赛。

4 个答案:

答案 0 :(得分:12)

使用Structural Search & Replace(编辑|查找|替换结构...),它专为此类用例而设计。

使用搜索模板:

$x$.getName() == null

替换模板:

$x$.hasName()

单击编辑变量... 按钮,并将表达式类型(正则表达式)指定为MyClass。搜索时,您还会找到getObject().getName() == null

的示例

答案 1 :(得分:5)

使用Find and Replace Code Duplicates

  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;
      }
      

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

答案 2 :(得分:2)

您可以将getName()重命名为putGuidInHereIfYouWantToBeSure(),然后在putGuidInHereIfYouWantToBeSure() == null hasName()

的所有文件中进行简单替换

答案 3 :(得分:-1)

来自intelliJ Documentation

替换指定路径中所有文件中的一段文本

  1. 执行以下操作之一:
    • 在主菜单上,选择编辑|找到|在路径中替换
    • Ctrl + Shift + R
    • 在路径中查找对话框中,按 Ctrl + Shift + R 切换到替换路径对话框。
  2. 替换路径对话框中,指定搜索和替换字符串,搜索选项和范围。显式键入搜索和替换文本,或使用正则表达式指定模式,或从最近历史记录下拉列表中选择以前使用的文本或模式。
    • 如果您通过正则表达式指定搜索和/或替换文本,请在后引用中使用$n格式(以引用以前找到并保存的模式)。
    • 要在正则表达式中使用反斜杠字符\,请在介词中插入三个额外的反斜杠来转义有意义的反斜杠:\\\\
  3. 点击在查找窗口中替换。 IntelliJ IDEA显示Find tool window中遇到的搜索字符串的出现次数,选择第一次出现并在编辑器中打开具有此事件的文件并将焦点移动到它。
    同时,IntelliJ IDEA打开替换使用对话框,其中包含标题栏中遇到的事件的完整路径: enter image description here 执行以下操作之一:
    • 要替换所选的事件,请点击替换
    • 要保留所选的匹配项并移至下一个,请点击跳过
    • 要替换当前活动标签中所有匹配项,请点击在此文件中全部替换
    • 要在当前有效标签(任意)中保留搜索字符串的出现次数并移至下一个文件,请点击跳至下一个文件
    • 要替换所有检测到的事件,请点击所有文件
    • 要切换到手动模式,请单击预览。关闭替换使用情况对话框,焦点移至查找工具窗口。执行以下操作之一:
      • 浏览检测到的事件列表,选择要替换的事件,然后点击替换所选
      • 要更改所有实例,请点击全部替换