大家都知道在绝大多数情况下,我们都不应该是用static方法。但如果真的有了,比如说是在遗留系统中有这样的代码,我们应该怎么样“安全”的重构呢?
给一个简单的例子,假设我们有一个类叫做MyMath,代码如下:
MyMathTest.java
public class MyMathTest {
@Test
public void shouldReturnSumOfTwoNumbersWhenAdd() {
assertThat(MyMath.add(1, 1), is(2));
}
}
MyMath.java
public class MyMath {
public static int add(int a, int b) {
return a + b;
}
}
方法一:手动替换
1.拷贝static方法的body到另一个临时方法里
MyMath.java
public class MyMath {
public static int add(int a, int b) {
return a + b;
}
public int add2(int a, int b) {
return a + b;
}
}
2.delegate方法调用
public static int add(int a, int b) {
return new MyMath().add2(a, b);
}
3. inline static方法
public class MyMath {
public int add2(int a, int b) {
return a + b;
}
}
public class MyMathTest {
@Test
public void shouldReturnSumOfTwoNumbersWhenAdd() {
assertThat(new MyMath().add2(1, 1), is(2));
}
}
这样就达到了替换的目的。
4. 重命名add2到add,完
方法二:intellij的convert to instance method
1.改变方法签名(Command/Ctrl + F6),传入一个MyMath的instance
public class MyMath {
public static int add(int a, int b, MyMath myMath) {
return a + b;
}
}
public class MyMathTest {
@Test
public void shouldReturnSumOfTwoNumbersWhenAdd() {
assertThat(MyMath.add(1, 1, new MyMath()), is(2));
}
}
2.使用intellij的convert to instance method
选中add,然后在refactor中选中convert to instance method。
在弹出的窗口中选择instance parameter为myMath。
然后就大工告成:
public class MyMath {
public int add(int a, int b) {
return a + b;
}
}
public class MyMathTest {
@Test
public void shouldReturnSumOfTwoNumbersWhenAdd() {
assertThat(new MyMath().add(1, 1), is(2));
}
}
总结:
在开始学重构的时候,最好是从手动重构开始,包括最简单的提取方法这些,都最好从手动开始,到后面,你重复了足够次数以后,尽量采用IntelliJ的自动重构来进行重构