在Eclipse中的部分代码中重构引用变量

时间:2014-03-25 15:45:02

标签: java eclipse refactoring rename

我如何仅在部分代码中重命名变量?

例如:

System.out.println("Rectangle 1: " + "\n" + "Width: " + r1.width + "\n" + "Height: " +
        r1.height + "\n" + "Color: " + r1.color + "\n" + "Area and Perimeter: " + 
                r1.getArea(r1.width, r1.height) + ", " + r1.getPerimeter(r1.width, r1.height));

因此,如果我想使用r2作为refVar为第二个矩形键入相同的内容,有没有办法可以快速执行此操作?我尝试使用Alt + Shift + R复制和粘贴,但最终会更改所有r1 refvars。

2 个答案:

答案 0 :(得分:0)

我建议您使用查找/替换对话框来解决此问题,以满足您的需求。选择一组语句,然后按 Ctrl + F 。将弹出“查找/替换”对话框,请注意在范围组中选择了选定行选项。

您可以使用全部替换替换/查找。但请注意,如果找到它,它也会替换注释中的字符串。

参见下图。

enter image description here

答案 1 :(得分:-1)

看看don't repeat yourself (DRY)原则,旨在防止像你这样的情况。而不是重命名变量创建单独的方法,它将接受任何Rectangle并打印其详细信息。

public static void printRectangleDetails(Rectangle r){

    System.out.println("Rectangle 1: " + "\n" + "Width: " + r.width + "\n" + "Height: " +
            r.height + "\n" + "Color: " + r.color + "\n" + "Area and Perimeter: " + 
                    r.getArea(r.width, r.height) + ", " + r.getPerimeter(r.width, r.height));
}

现在,您可以在需要时将其与r1r2矩形一起使用

printRectangleDetails(r1);
...
printRectangleDetails(r2);

如果由于某些原因您无法创建单独的方法并使用DRY原则,您可以执行以下操作:

我们说

String foo = "foo";
System.out.println(foo+" hello wordls"+ foo);

String bar = "bar";
System.out.println(foo+" hello wordls"+ foo);

并且您希望将第二个打印语句中的foo替换为bar。在第二个打印声明中使用 Alt + Shift + R (或从菜单:Refactor - > Rename..)将重命名所有foo引用。为了防止它重新声明你的foo引用(编译器会给你错误,但不要担心,我们稍后会删除它,只有在重命名过程时才有用),就在你要更改的语句之前{{1转移到foo喜欢

bar

现在在这个新副本String foo = "foo"; System.out.println(foo+" hello wordls"+ foo); String bar = "bar"; String foo = "whatever"; // ^^^ System.out.println(foo+" hello wordls"+ foo); 上使用 Alt + Shift + R ,eclipse会查找foo从这个新的引用,并忽略早期的foo,所以你应该能够看到像

这样的东西

enter image description here

(如您所见,前两个foo未被选中进行重命名)
所以你可以把它改成foo喜欢

bar

之后刚刚删除了这个额外的String foo = "foo"; System.out.println(foo+" hello wordls"+ foo); String bar = "bar"; String bar = "whatever"; System.out.println(bar+" hello wordls"+ bar); ,因为您不再需要它了。

但要小心。这样,您将在重复String bar = "whatever";之后重命名所有foo个变量,而不仅仅是foo中要重命名的变量。为了确保您没有更改任何您不想要的内容,请在方法结束时放置要更改的代码(确定没有System.out.println(foo+" hello wordls"+ foo);之后不应更改)。完成后,将更改的代码移动到您想要的位置。