如何跨文件提取方法?

sla*_*dan 12 java refactoring intellij-idea structural-search

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

myObject.getName() == null
Run Code Online (Sandbox Code Playgroud)

接着就,随即:

myObject.hasName()
Run Code Online (Sandbox Code Playgroud)

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

  • 我希望它特定于getName我的类的方法MyClass而不是替换代码,它引用getName其他类调用的方法.
  • 我希望它能找到尽可能多的匹配.它不应该关心额外的空格,换行符等.如果变量有另一个名称(如myObj或objX),它也应该工作.getObject().getName()也应该找到类似的电话.(搜索必须关注语义).
  • 我希望它快速而不是要求我逐个完成数百场比赛.

Bas*_*ers 12

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

使用搜索模板:

$x$.getName() == null
Run Code Online (Sandbox Code Playgroud)

替换模板:

$x$.hasName()
Run Code Online (Sandbox Code Playgroud)

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


Meo*_*Meo 5

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

  1. 创建实例方法:

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