Android Studio 技巧之【Rename】
快捷键 :
Shift + F6
Android Studio 里重命名变量、字段、方法、类、包的快捷方式。 。
描述 :
在代码中重命名变量、字段、方法、类、包,是一件要小心对待的工作,所有的修改一定确保对上下文有意义。
确保对上下文有意义一般分两种情况。
1、要保证全部改名。
无论要改名的是变量、字段、方法、类还是包, 这些变量、字段、方法、类、包可能已经在整个程序的多处被引用了,所以要改名必须在所有的地方全部修改,不能遗漏。
2、要做有意义的修改,不能无脑似地见了和要改名的字符串一样的字符串就改。
一个和要改名的变量名相同的字符串,可能在代码的别的地方仅仅是另一个字符串的一部分,这种情况就不能修改。
针对第一种情况,似乎用全文替换可以快速完成改名的工作。但是全文替换,是见了相同的字符串就改,这样的话,对第二种情况又不合适。这种粗暴的替换有可能修改了不该修改的字符串,造成很隐蔽的难以发现的BUG。
所以,要改名的话,一般是用在整个工程文件中或者当前文件中全文查找的方式,找出所有可能要改名的字符串,一个个看,一个个修改,该改的改,不该改的地方不改。
但是细致是一方面,在细致的同时也要追求工作效率。在Android Studio中用Shift + F6 快捷键可以让我们高效地完成重命名的工作,而且该操作能确保重命名对上下文有意义,不会无脑替换掉所有文件中的名字。
虽然这个快捷键功能很强大,但却不是用了以后直接按Enter那么简单,依然需要手工干预,根据不同的情况选择哪些改,哪些不改。
所以如果你已经看到这里,希望你认真地看下去。和前面文章中介绍的哪些快捷键不一样,这个快捷键用好了,可以极大地提高效率,但是如果用不好,带来的麻烦甚至多过其带来的方便。
使用 :
下面看示例代码:
上图的代码中首先定义了一个全局变量sVar,这个全局变量sVar在method2和method3都被引用。
method1中又定义一个本地变量,名字也叫sVar。
在每个方法中还有被“” 括起来的文本字符串里的sVar,如method2和method3 Log语句里的"sVar: "以及method1里的本地变量sVar的值Local sVar.
现在要将全局变量sVar改名为gVar.
例子1 :
仅仅将全局变量sVar改名为gVar,其它所有注释和文本字符串里的同名字符串全部不改变。
也就是改变全局变量sVar的定义的部分和在其它地方引用它的部分,即上图中高亮的的sVar声明处,method2和method3中Log语句中引用sVar的三个地方。
1、将光标定位到public String sVar行中的sVar上
,按 Shift + F6 。
图中可以看到,public String sVar行中的sVar被红框围住,代表要对其改名,其它两个引用处也被高亮选择了。
屏幕上同时还有一个弹窗,弹窗里上面四行是给出的建议修改的名称。这时候其实直接改名后按Enter即可,但是强烈建议不要这样做。
保险的做法是根据最下面的提示Press Shift+F6 to show dialog with more option,继续按 Shift + F6 。
2、再次按 Shift + F6 。
又出现一个弹窗,弹窗里的文本框是让我们输入要改的名字。
重要的是下面两个Checkbox。
第一个是Sesrch in comments and strings, 意思是在注释和文本字符串里搜索。 如果选择了这个选项,那么所有在注释和文本字符串里出现的sVar都会被包括进来修改。
第二个是Search for text occurrences, 意思是在字面意义上的搜索。 这个选项没有什么用,因为 Shift + F6 实际上是一个代码重构的快捷键,不是做文本替换的命令。所以选不选这个选项都不起作用。
在这个例子中,我们不想修改注释和文本字符串里的同名字符串,所以我们不选Sesrch in comments and strings这个选项。
3、将这两个选项前的Checkbox都清空。并且将文本框里的sVar改为gVar。
4、点击Refactor按钮。
现在可以看到,应该修改的三个地方全部被修改好了。
文本字符串里的sVar没有被修改,因为我们没有选择Sesrch in comments and strings这个选项。
而method1里的sVar则原封不动。因为method1里的sVar实际上是另外一个本地变量,和要修改的全局变量仅仅是名字相同,完全是两回事。
这就是符合上下文意义的正确的改名,确保了全部修改和正确的有意义的修改。
动画演示 :

如果你看到这里,应该已经了解了Shift + F6 的方便和高效,但是聪明的你也应该注意到,在给全局变量sVar改名的同时,其实method2和method3里的两个Log语句中的字符串sVar也应该同时修改。不然的话,虽然改名没有造成程序运行的BUG,但是却造成了功能上的BUG。
如果不同时修改两个LOG语句中的sVar, 那打印出来的LOG就指鹿为马了,因为现在sVar已经改名叫gVar了。
下面我们就用第二个例子来看,怎么做到一次完美的改名。
例子2 :
将全局变量sVar改名为gVar,同时修改所有相关注释和文本字符串里的sVar。
1、和例子1一样,将光标定位到public String sVar行中的sVar上,按Shift + F6
2、再次按Shift + F6
3、这次因为要修改文本字符串里的sVar。所以我们勾选
Sesrch in comments and strings, 意思是在注释和文本字符串里搜索。 选择了这个选项,那么所有在注释和文本字符串里出现的sVar都会被包括进来修改。
同时在文本框中将sVar改为gVar
4、点击Refactor按钮。
这次在Android Studio的下部出现了一个如图的窗口。
这个窗口里,标识出了所有可能需要修改的地方,
最上面的如上图的部分,说明了要改名的变量。
中间如上图的这一块说明,在55行method2的Log语句引用了sVar,需要修改。 下面method3中也有一个引用。可以点击向右的箭头将其打开,查看详细的信息。
上面这两处是我们肯定要修改的,所以我们不去管它。
因为这次我们选择了Sesrch in comments and strings,所以我们最关心的是最下面的部分,看下图。
这是说sVar在注释,文本字符串和非代码文本中出现了三次。 很明显,这是我们要仔细查看并处理的地方。
5、点击该行文字前面的向右的箭头,将其打开。
看到了吧,这里是说在method1、method2、method3中的注释或者文本字符串中各有一个sVar.
6、点击第一个method1前的箭头将其打开。
这里指明在50行的String sVar = "Local sVar";里有一个sVar。
这里我们不需要修改。所以必须将其标识为不修改。
7、在method1() 1 usage这一行上右击,弹出下面的弹窗。
8、在弹出的菜单上有Exclude和Remove这两个选项。随便点击任意一个都可以。这里我们点击Remove将其移除。
现在看到屏幕上只有method2和method3了,分别标明在55行和59行各有一个LOG语句,其中有sVar可能需要修改。
而这两个是我们确实需要修改的。所以不做任何动作,继续保留。
9、点击Do Refactor按钮。
现在,可以看到最后的结果完全符合我们的要求。
全局变量的定义,两个引用以及在method2和method3中两个LOG语句里的文本字符串中的sVar都被正确地改成了gVar。
动画演示 :

总结
用 Shift + F6 快捷键,可以快速重命名变量、字段、方法、类、包。并且可以确保重命名对上下文有意义,不会无脑替换掉所有文件中的名字。
但是使用该快捷键需要格外的细心,需要根据代码不同的情况手工加以处理。
更多Android Studio技巧
Android Studio 技巧之【Join Lines and Literals】
Android Studio 技巧之【Delete Line】
Android Studio 技巧之【Move Methods】
Android Studio 技巧之【Duplicate Line】
Android Studio 技巧之【Move Lines Up Down】
Android Studio 技巧之【Extend/Shrink Selection】
Android Studio 技巧之【Sublime Text Multi Selection】
Android Studio 技巧之【Column Selection】
Android Studio 技巧之【Extract Parameter】
Android Studio 技巧之【Extract Constant】
Android Studio 技巧之【Extract Method】
Android Studio技巧之【Extract Field】
