2014-03-25 40 views
1

我将如何去重命名仅在部分代码中的变量?在Eclipse的代码的一部分重构参考变量

例如:

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。

+0

为什么不创建另一个矩形对象? – User27854

+0

是否正在创建单独的方法,可以为传递的Rectangle生成此输出一个选项?看看http://en.wikipedia.org/wiki/Don%27t_repeat_yourself – Pshemo

+0

我有另一个对象r2,它只是我想打印出他们的细节。我应该只使用toString()方法返回一个字符串中的所有对象字段吗? 编辑:@Pshemo是的,我想我会这样做 – user3278117

回答

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

你可以在需要

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

当你r1r2矩形使用它,如果由于某种原因,你不能创建单独的方法和使用DRY原则,你可以做一些事情像这样:

,假设我们已经

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

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

并且您要在第二个打印语句中将foo替换为bar。使用Alt键 + + [R(或从菜单:Refactor - >Rename..)在第二次印刷的语句将重新命名所有foo引用。为了防止它再次声明你的foo参考(编译器会给你的错误,但不要担心,我们将在稍后删除它,它是唯一的,而重命名过程有用)刚从要改变foobar

语句之前
String foo = "foo"; 
System.out.println(foo+" hello wordls"+ foo); 

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

现在使用Alt键 + + [R这一新的复制foo和eclipse将寻找foo从这个新的参考,而忽略早期foo S,所以你应该能够看到类似

enter image description here

(你可以看到前两个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);中的变量。为了确保你没有改变你不想做的任何事情,在你的方法结尾放置你想改变的代码(在你确定没有foo之后不应该改变它)。完成之后,将您更改的代码移至您想要的位置。

+0

如果觉得,Overiding toString方法将是一个更好的选择,如果它只是打印出结果。 – User27854

+0

@ user2900314嗯,这取决于。通常,我们重写toString以创建可用于日志和错误消息的非常简短的对象描述,并且我们创建单独的方法来生成更多描述性输出/ String。但是,是的,如果OP可以更新Rectangle类,那么将此方法添加到它会更好,然后在其他类中创建一个。 – Pshemo

+0

好吧现在明白了.. – User27854

0

我建议你使用查找/替换这个问题的对话框它适合你的需要。选择一组语句,然后按Ctrl + F。弹出一个查找/替换对话框,注意在范围内选定的行选项被选中。

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

请参考下面的图片。

enter image description here

+0

正如你所提到的,这种方法是不安全的,因为可能存在假阳性结果,并且'r1'可以在许多不需要的地方改变。在这种情况下,OP将不得不使用此工具手动迭代所有搜索结果并选择是否应该更改。我相信OP正试图避免它,并正在寻找一种方法/工具来自动执行,而不是手动执行。 – Pshemo