如何跨文件提取方法?

How to extract a method across files?

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

myObject.getName() == null

有了那个:

myObject.hasName()

是否有使用 IntelliJ IDEA 执行此操作的任何操作或策略?

来自intelliJ Documentation


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

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

使用Find and Replace Code Duplicates.

  1. 创建实例方法:

    public boolean hasName() {
        return getName() == null;
    }
    
    • 为此,我建议选择 myObject.getName() == null,然后使用操作 Refactor |摘录 |方法... 重构 |移动...,因此您无需输入任何代码。
  2. 点击方法,使用Refactor |查找并替换重复代码.

    • 但是它不会重构像这样的用法:

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

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

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

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

使用搜索模板:

$x$.getName() == null

替换模板:

$x$.hasName()

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

的示例

您可以将 getName() 重命名为 putGuidInHereIfYouWantToBeSure() 之类的名称,然后将所有文件中的 putGuidInHereIfYouWantToBeSure() == null 替换为 hasName()