当我刚提取参数时,是否有一种方法可以让Intellij用一个方法替换重复的代码?

4
如果我运行重构提取方法,IntelliJ有时会注意到有相似的代码可以用这个新方法替换。在很多情况下,我的下一步是提取参数,现在这个方法可以使用的地方更多了。但是,当我提取参数时,IntelliJ不检查是否有新的代码重复。有没有办法做到这一点?

第一步

package mavensandbox;

public class Main {


    public void foo() {
        System.out.println("foo");
    }

    public void bar() {
        System.out.println("bar");  //I will extract method for this line
    }

}

第二步

package mavensandbox;

public class Main {


    public void foo() {
        System.out.println("foo");
    }

    public void bar() {
        print();
    }

    private void print() {
        System.out.println("bar");  //doh, I wanted "bar" to be a parameter, that's the next step
    }

}

第三步

package mavensandbox;

public class Main {


    public void foo() {
        System.out.println("foo");  //ok, so how do I get intellij to realize it can now call print("foo"); instead?
    }

    public void bar() {
        print("bar");
    }

    private void print(String s) {
        System.out.println(s);
    }

}

根据评论所述,我应该如何让Intellij意识到现在可以调用print("foo");

1个回答

4

方法被提取后,IntelliJ并不足够聪明以根据提取参数来找出相似的重构方法。正如您发现的那样,它只会将参数提取到已经存在的调用提取方法的代码中。

在第一步中,尝试预先设置提取方法,通过像这样修改bar()

public void bar() {
    String s = "bar";
    System.out.println(s); // extract method for this line
}

然后在第二步,IntelliJ已经足够聪明,能够找出所有相似的重构。

如果你被困在第二步作为起点,因为第一个提取方法重构已经完成并提交了,请按照我上面说的方法将print()方法(从中提取方法)应用到它,并且你应该能够达到相同的结果。然后你只需要删除剩余的零参数print()即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接