java开发150个建议( 五 )


这段代码分析一下,输出结果,以及语法含义:
首先这段代码中有标号(:)操作符,C语言的同学一看便知,类似JAVA中的保留关键字 go to 语句,但Java中抛弃了goto语法,只是不进行语义处理,与此类似的还有const关键字 。Java中虽然没有了goto语法,但扩展了break和关键字,他们的后面都可以加上标号做跳转,完全实现了goto功能,同时也把goto的诟病带进来了 。运行之后代码输入为"save....",运行时没错,但这样的代码,给大家阅读上造成了很大的问题,所以就语法就让他随风远去吧!
回到顶部
建议9:少用静态导入
从Java5开始引入了静态导入语法( ),其目的是为了减少字符的输入量,提高代码的可阅读性,以便更好地理解程序 。我们先俩看一个不用静态导入的例子,也就是一般导入:
1 public class Client9 {2// 计算圆面积3public static double claCircleArea(double r) {4return Math.PI * r * r;5}6 7// 计算球面积8public static double claBallArea(double r) {9return 4 * Math.PI * r * r;10}11 }
这是很简单的两个方法,我们再这两个计算面积的方法中都引入了java.lang.Math类(该类是默认导入的)中的PI(圆周率)常量,而Math这个类写在这里有点多余,特别是如果类中的方法比较多时 。如果每次输入都需要敲入Math这个类,繁琐且多余,静态导入可以解决此问题,使用静态导入后的程序如下:
1 import static java.lang.Math.PI;2 3 public class Client9 {4// 计算圆面积5public static double claCircleArea(double r) {6return PI * r * r;7}8 9// 计算球面积10public static double claBallArea(double r) {11return 4 * PI * r * r;12}13 }
静态导入的作用是把Math类中的Pi常量引入到本类中,这会是程序更简单,更容易阅读,只要看到PI就知道这是圆周率,不用每次都把类名写全了 。但是,滥用静态导入会使程序更难阅读,更难维护,静态导入后,代码中就不需要再写类名了,但我们知道类是"一类事物的描述",缺少了类名的修饰,静态属性和静态方法的表象意义可以被无限放大,这会让阅读者很难弄清楚其属性或者方法代表何意,绳子哪一类的属性(方法)都要思考一番(当然IDE的友好提示功能另说),把一个类的静态导入元素都引入进来了,那简直就是噩梦 。我们来看下面的例子:
1 import static java.lang.Math.*;2 import static java.lang.Double.*;3 import static java.lang.Integer.*;4 import static java.text.NumberFormat.*;5 6 import java.text.NumberFormat;7 8 public class Client9 {9 10public static void formatMessage(String s) {11System.out.println("圆面积是: " + s);12}13 14public static void main(String[] args) {15double s = PI * parseDouble(args[0]);16NumberFormat nf = getInstance();17nf.setMaximumFractionDigits(parseInt(args[1]));18formatMessage(nf.format(s));19 20}21 }
就这么一段程序,看着就让人恼火,常量PI,这知道是圆周率;方法可能是类的一个转换方法,这看名称可以猜的到 。那紧接着()方法是哪个类的?是本地类?不对呀,本地没有这个方法,哦,原来是类的方法,这个和本地方法没有任何区别了---这代码太难阅读了,肯定有人骂娘 。
所以,对于静态导入,一定要追寻两个原则:
不使用*(星号)通配符,除非是导入静态常量类(只包含常量的类或接口);方法名是具有明确、清晰表象意义的工具类 。
何为具有明确、清晰表象意义的工具类,我们看看Junit中使用静态导入的例子:
1 import static org.junit.Assert.*;2 class DaoTest{3@Test4public void testInsert(){5//断言6assertEquals("foo","foo");7assertFalse(Boolean.FALSE);8}9 }
我们从程序中很容易判断出方法是用来断言两个值是否相等的,方法则是断言表达式为假,如此确实减少了代码量,而且代码的可读性也提高了,这也是静态导入用到正确的地方带来的好处 。