一、分析 

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

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

二、场景 

如此段代码:

  1. import static java.lang.Math.PI;
  2.  
  3. public class MathUtils{
  4. //计算圆面积
  5. public static double calCircleArea(double r){
  6. return PI * r * r;
  7. }
  8. //计算球面积
  9. public static double calBallArea(double r){
  10. return 4 * PI * r * r;
  11. }
  12. }

静态导入把Math类中的PI常量引入到本类中,这回是程序更简单,更容易阅读,只要看到PI就知道是圆周率,不用每次都要把类名写出来。

又如此段代码:

  1. import static org.jnuit.Assert.*;
  2.  
  3. public class DaoTest{
  4. @Test
  5. public void testInsert(){
  6. //断言
  7. assertEquals("foo",foo);
  8. assertFalse(Boolean.FALSE);
  9. }
  10. }

我们从程序中很容易判断出assertEquals方法时用来判断两个值是否相等的,assertFalse方法则是断言表达式为假的。这就是具有明确、清晰表象意义的工具类,使用静态导入,减少代码量,提高代码可读性的好处。

但是,如此段代码:

  1. import static java.lang.Double.*;
  2. import static java.lang.Math.*;
  3. import static java.lang.Integer.*;
  4. import static java.text.NumberFormat.*;
  5.  
  6. public class Client{
  7. //输入半径和精度要求,计算面积
  8. public static void main(String[] args){
  9. double s = PI * parseDouble(args[0]);
  10. NumberFormat nf = getInstance();
  11. nf.setMaxinumFractionDigits(parseInt(args[1]));
  12. formatMessage(nf.format(s));
  13. }
  14.  
  15. //格式化消息输出
  16. public static void formatMessage(String s){
  17. System.out.println("圆面积是:" + s);
  18. }
  19. }

就这么一段程序:常量PI,这个知道是圆周率;parseDouble方法可能是Double类的一个转换方法;getInstance方法时那个类的?Client本地类?NumberFormate类?这个方法和formatMessage方法没有任何区别—这代码太难阅读了,非机器不可阅读。

三、建议 

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

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

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

提高你的Java代码质量吧:少用静态导入的更多相关文章

  1. 提高你的Java代码质量吧:推荐在复杂字符串操作中使用正则表达式

    一.分析  字符串的操作,诸如追加.合并.替换.倒序.分隔等,都是在编码过程中经常用到的,而且Java也提供了append.replace.reverse.split等方法来完成这些操作,它们使用起来 ...

  2. 提高你的Java代码质量吧:如果有必要,使用变长数组吧

    一.分析  Java中的数组是定长的,一旦经过初始化声明就不可改变长度,这在实际使用中非常不方便. 二.场景  比如要对班级学生的信息进行统计,因为我们不知道一个班级会有多少学生(随时都有可能会有学生 ...

  3. 提高你的Java代码质量吧:小心switch带来的空值异常

    一.分析  使用枚举定义常量时,会有伴有大量的switch语句判断,目的是为每个枚举解释其行为. 我们知道,目前的Java的switch语句只能判断byte.short.char.int类型(JDK7 ...

  4. 提高你的Java代码质量吧:使用valueof前必须进行校验

    一.分析 每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode.name.valueOf等,其中valueOf方法会把一个String类型的名称转变成枚 ...

  5. 提高你的Java代码质量吧:不要让类型默默转换

    一.分析  在Java运算中的类型转换,是先运算在进行类型转换的.具体场景如下. 二.场景  在如下程序中: public class Client{ public static final int ...

  6. 提高你的Java代码质量吧:谨慎包装类型的比较

    一.分析  基本类型可以比较大小,其所对应的包装类型都实现了Comparable接口此问题. 二.场景  代码如下: public class Client{ public static void m ...

  7. 提高你的Java代码质量吧:让我们疑惑的字符串拼接方式的选择

    一.分析  对于一个字符串进行拼接有三种方法:加号.concat方法.及StringBuiler或StringBuffer. 1."+"方法拼接字符串  str += " ...

  8. 提高你的Java代码质量吧:使用构造函数协助描述枚举项

    一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性. 二.场景 比如,可以通过枚举构造函数声明业务值,定 ...

  9. 提高你的Java代码质量吧:正确使用String、StringBuffer、StringBuilder

    一.建议  CharSequence接口有三个实现类与字符串相关:String.StringBuffer.StringBuilder,虽然它们都与字符串相关,但是其处理机制不同. 根据不同的场景,建议 ...

随机推荐

  1. 重载操作符 operator overloading 学习笔记

    重载操作符,只是另外一种调用函数的方法和表现方式,在某些情况它可以让代码更简单易读.注意不要过度使用重载操作符,除非它让你的类更简单,让你的代码更易读. 1语法 如下: 其中友元,关键字不是必须的,但 ...

  2. (转载)Web存储和SessionStorage locaStorage

    <转> sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在 ...

  3. UVa 120 (构造) Stacks of Flapjacks

    这题求解的过程和选择排序非常相似. 反转的过程中分为无序(在前面)和有序(在后面)两个部分,一开始视为全部为无序. 在无序部分中找到最大的元素,先把它翻到最前面,然后再反转到无序部分的最后面.这样该元 ...

  4. Java 简单登录MVC

    构建一个简单的基于MVC模式的JavaWeb 零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是 ...

  5. 图片处理 Pillow

    Pillow 在python3下用PIL做图像处理 Python图像处理库:Pillow 初级教程 from PIL import Image im = Image.open('22.gif') pr ...

  6. 【Java基础之容器】Iterator

    Iterator: ->所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象 ->Iterator对象称作迭代器,用以方便的实 ...

  7. 【转】Ubuntu 14.04配置安装java环境和android开发环境(包括真机调试环境)

    原文网址:http://my.oschina.net/HalZf/blog/347351 总要记录下过程,不然老是会忘记掉-真老了.-_-! 一.配置安装ubuntu 64位java环境: 1.下载l ...

  8. Android MVP架构分析

    App架构在Android开发者中一直是讨论比较多的一个话题,目前讨论较多的有MVP.MVVM.Clean这三种.google官方对于架构的态度一直是非常开放的,让开发者自主选择组织和架构app的方式 ...

  9. 初识NuGet - 概念, 安装和使用

    1. NuGet是什么? NuGet is a Visual Studio 2010 extension that makes it easy to add, remove, and update l ...

  10. POJ 2486-Apple Tree(树状背包)

    题意 n个节点的树,每个节点都有价值,求在树上最多走k步获得的最大价值(从1开始走,节点的价值只能获取一次) 分析: 开始以为是最基础的树形背包,但后来发现,不能只走子树,有可能还回到根节点,dp[i ...