前言
idea自带了重构功能,利用好idea的重构功能,可以大幅提高编码效率和代码质量。
常用的重构技巧
字段/变量批量重命名
Refactor -> Rename可以查看快捷键,将光标移动到要重命名的地方或者选中,然后按快捷键,然后输入新的名字,最后回车即可。这样所有用到的地方都会自动被重命名。
int aa =0;int total = aa + 10;选中aa,按快捷键(Windows为alt+shift+r),然后输入新的名字,比如num,容纳后回车。int num =0;int total = num + 10;
重命名Class文件
方法和重命名字段/变量一样
添加方法字段
比如有方法:
private static void print(String abc) { System.out.println("abc = " + abc);}
在调用的时候想再添加一个int类型的参数,怎么做?
![32bf63da7f42e1130aa0b421ba5d1370.png](https://i-blog.csdnimg.cn/blog_migrate/37e98a9080c64d27a478f989b2df0087.jpeg)
可以直接在调用的地方,写上要加的参数的值,然后按ALT+ENTER,选择Add xx as ...即可。
抽取重复的值为变量
比如有如下调用:
Date d1 = DateUtil.parse("2020-09-01", "yyyy-MM-dd");Date d2 = DateUtil.parse("2020-09-02", "yyyy-MM-dd");Date d3 = DateUtil.parse("2020-09-03", "yyyy-MM-dd");
可以看到,yyyy-MM-dd是一样的,可以进行抽取为一个变量。
选中"yyyy-MM-dd",执行Refactor->Extract->Variable(alt+shift+L)操作。
![eba5f0084cd6f29accd4885aace4cc77.png](https://i-blog.csdnimg.cn/blog_migrate/39e4e5b8914e07ae9d2755feb16d9233.jpeg)
这里有2个选择:替换选中的地方和替换所有出现的地方。选择替换所有出现的地方即可。
抽取重复的值为常量
还是上面的例子,选中"yyyy-MM-dd",执行Refactor->Extract->Constant(ctrl+alt+C)。
![378da271ee0297e7a61c080b01b8110c.png](https://i-blog.csdnimg.cn/blog_migrate/157b6423a6652aacd21baace9a07f010.jpeg)
选择PATTERN,这样就会在当前类中定义一个常量:public static final String PATTERN = "yyyy-MM-dd";
将变量添加为方法参数
比如在方法中定义了变量boolean parse = false;如果要将parse添加为方法参数,光标定位到parse,执行Refactor->Extract->Parameter(CTRL+ALT+P),改变量就会成为方法参数。
![98388376938c1cbe65350e08b842ad49.png](https://i-blog.csdnimg.cn/blog_migrate/c2b119778e430ecf0b825d25c1aa2989.jpeg)
将多个方法参数抽取为一个对象作为方法的参数
比如:
private static void print(String name, int age, boolean parse) throws ParseException { System.out.println("name = " + name + ",age=" + age); Date d1 = DateUtil.parse("2020-09-01", PATTERN); Date d2 = DateUtil.parse("2020-09-02", PATTERN); Date d3 = DateUtil.parse("2020-09-03", PATTERN);}
如果要将方法的多个参数抽取一个参数对象,执行Refactor->Extract->Parameter Objet。
![6461bdb4b8d9e1adaf8dd07f4f35e11a.png](https://i-blog.csdnimg.cn/blog_migrate/e111779e2f01c7f5bc2cf50ae72da169.jpeg)
这里默认是选择所有的方法参数,作为Class的字段,你可以根据需要选择。比如这里只选择了name和age。
然后点Refactor,生成的MyParamterObj如下:
public class MyParameterObj { private final String name; private final int age; public MyParameterObj(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; }}
原来的方法变为:
private static void print(MyParameterObj myParameterObj, boolean parse) throws ParseException { System.out.println("name = " + myParameterObj.getName() + ",age=" + myParameterObj.getAge()); Date d1 = DateUtil.parse("2020-09-01", PATTERN); Date d2 = DateUtil.parse("2020-09-02", PATTERN); Date d3 = DateUtil.parse("2020-09-03", PATTERN); }
原来的name和age参数变为了MyParameterObj。
该方法调用的地方也变为了:
print(new MyParameterObj("jack", 13), false);
该重构功能,在方法参数很多的时候,是一个非常有用的功能。
从类中抽取方法作为接口
执行Refactor->Extract->Interface,然后选择要作为接口的方法列表
![e93ab0de036cdce4cab14087f73e8283.png](https://i-blog.csdnimg.cn/blog_migrate/58d00cfd0982ff7dddfbabf2487f34ab.jpeg)
点Refactor后,当前类会实现刚刚抽取的接口。
public class Test2 implements MyTestService { // ...}
创建的接口如下:
public interface MyTestService { void sayHello(String name);}
这也算是一个比较实用的功能。
还有提取方法作为Super Class的方法、将方法用包装类进行包装就不一一介绍了,和抽取方法作为接口方法差不多。