当前位置:编程学习 > JAVA >>

提高你的Java代码质量吧:少用静态导入

一、分析

从Java 5开始引入静态导入语法(import static),其目的是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。

但是,滥用静态导入会使程序更难阅读,更难维护。静态导入后,代码中就不用再写类名了,但是我们知道类是“一类事物的描述”,缺少了类名的修饰,静态属性和静态方法的表象意义就会被无限方法,这会让阅读者很难弄清楚其属性或方法代表何以,甚至是哪一个类的属性(方法)都要思考一番(当然,IDE友好提示功能另说),特别是在一个类中有多个静态导入语句时,若还是用*(星号)通配符,把一个类的所有静态元素都导入进来,那简直就是噩梦。

二、场景

如此段代码:

[java]
import static java.lang.Math.PI;  
  
    public  class MathUtils{  
    //计算圆面积   
    public static double calCircleArea(double r){  
        return PI * r * r;  
    }  
    //计算球面积   
    public static double calBallArea(double r){  
        return 4 * PI * r * r;  
    }  
}  

import static java.lang.Math.PI;
 
    public  class MathUtils{
    //计算圆面积
    public static double calCircleArea(double r){
        return PI * r * r;
    }
    //计算球面积
    public static double calBallArea(double r){
        return 4 * PI * r * r;
    }
} 静态导入把Math类中的PI常量引入到本类中,这回是程序更简单,更容易阅读,只要看到PI就知道是圆周率,不用每次都要把类名写出来。

又如此段代码:

[java]
mport static org.jnuit.Assert.*;  
  
    public class DaoTest{  
        @Test  
        public void testInsert(){  
        //断言   
        assertEquals("foo",foo);  
        assertFalse(Boolean.FALSE);  
    }  
}  

import static org.jnuit.Assert.*;
 
    public class DaoTest{
        @Test
        public void testInsert(){
        //断言
        assertEquals("foo",foo);
        assertFalse(Boolean.FALSE);
    }
} 我们从程序中很容易判断出assertEquals方法时用来判断两个值是否相等的,assertFalse方法则是断言表达式为假的。这就是具有明确、清晰表象意义的工具类,使用静态导入,减少代码量,提高代码可读性的好处。

但是,如此段代码:

[java]
import static java.lang.Double.*;  
import static java.lang.Math.*;  
import static java.lang.Integer.*;  
import static java.text.NumberFormat.*;  
  
public class Client{  
    //输入半径和精度要求,计算面积   
    public static void main(String[] args){  
        double s = PI * parseDouble(args[0]);  
        NumberFormat nf = getInstance();  
        nf.setMaxinumFractionDigits(parseInt(args[1]));  
        formatMessage(nf.format(s));  
    }  
  
    //格式化消息输出   
    public static void formatMessage(String s){  
    System.out.println("圆面积是:" + s);  
    }  
}  

import static java.lang.Double.*;
import static java.lang.Math.*;
import static java.lang.Integer.*;
import static java.text.NumberFormat.*;
 
public class Client{
    //输入半径和精度要求,计算面积
    public static void main(String[] args){
        double s = PI * parseDouble(args[0]);
        NumberFormat nf = getInstance();
        nf.setMaxinumFractionDigits(parseInt(args[1]));
        formatMessage(nf.format(s));
    }
 
    //格式化消息输出
    public static void formatMessage(String s){
    System.out.println("圆面积是:" + s);
    }
} 就这么一段程序:常量PI,这个知道是圆周率;parseDouble方法可能是Double类的一个转换方法;getInstance方法时那个类的?Client本地类?NumberFormate类?这个方法和formatMessage方法没有任何区别—这代码太难阅读了,非机器不可阅读。

三、建议

对于静态导入,一定要遵循两个规则:

1.不要使用*(星号)通配符,除非是导入静态常量(只包含常量的类或接口)。

2.方法名是具有明确、清晰表象意义的工具类。

 

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,