9. 少用静态导入
为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序,从Java 5开始引入了静态导入语法( import static )。
// 简单的导入
public class MathUtils{
public static double calArea(double r){
return Math.PI * r * r;
}
}
// 静态导入
import static java.lang.Math.Pi;
public class MathUtils{
public static calArea(double r){
return PI * r * r;
}
}
用 Math.PI 这个语法,使程序简洁了很多,也更容易阅读。
但这是基于看到 PI 就知道这是圆周率这种被大家熟知的范畴,想想都知道,如果滥用静态导入会使程序更难阅读,也更难维护,一旦使用了静态导入,代码中就不用再写类名,这时属性和方法的表象意义可以被无限放大,让阅读者很难弄清楚它们代表什么意思,甚至是哪个类的属性(方法)都要思考一番(友好的IDE提示功能另说)。如果引入的是 * 通配符,那简直就是灾难。
import static java.lang.Double.*;
import static java.lang.Math.*;
import static java.lang.Integer.*;
import static java.text.NumberFormat.*;
import java.text.NumberFormat;
public class Client {
public static void main(String[] args){
double s = PI * parseDouble(args[0]);
NumberFormat nf = getInstance();
nf.setMaximumFractionDigits(parseInt(args[1]));
System.out.println("面积:" + nf.format(s));
}
}
所以,对于静态导入,要遵循两个规则:
1. 不使用 * (星号)通配符,除非是导入静态常量类(只包含常量的类或接口)。
2. 方法名是具有明确、清晰表象意义的工具类。
如 JUnit4 中使用的静态导入例子:
import static org.junit.Assert.*;
public class DaoTest{
@Test
public void testInsert(){}
//断言
assertEquals("foo","foo");
assertFalse(Boolean.FALSE);
}