一、分析 

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

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

二、场景 

如此段代码:

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就知道是圆周率,不用每次都要把类名写出来。

又如此段代码:

import static org.jnuit.Assert.*; 

    public class DaoTest{
@Test
public void testInsert(){
//断言
assertEquals("foo",foo);
assertFalse(Boolean.FALSE);
}
}

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

但是,如此段代码:

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代码质量吧:少用静态导入的更多相关文章

  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. nagios&pnp4nagios--yum 安装

    一. 环境: 1. centos 6.4 2. 设置hostname 并且安装好apache 3. 关闭selinux及iptables 二. 安装nagios服务器端: 1. rpm -Uvh ht ...

  2. 斜率优化dp(POJ1180 Uva1451)

    学这个斜率优化dp却找到这个真心容易出错的题目,其中要从n倒过来到1的确实没有想到,另外斜率优化dp的算法一开始看网上各种大牛博客自以为懂了,最后才发现是错了. 不过觉得看那些博客中都是用文字来描述, ...

  3. JSOI2007建筑抢修

    实际上和大多这类题一样(比如wikioi上的地鼠游戏),考察的都是堆的操作 这次改完之后就算把堆的模版定下来了 悲剧的是:大根堆打成了小根堆,导致一开始一直是10分…… 按结束时间排序,(经过验证,结 ...

  4. iframe的使用小贴士

    1.之前又说到“根据内容计算iframe的高度” 链接 2.现在想说的是,一般iframe页面都是嵌套在父页面当中,所以在一般在iframe里面做相关动作时默认都是iframe页面的,不会影响到父页面 ...

  5. AngularJS with MVC4 CRUD

    CRUD using MVC Web API and AngularJS In this article I am going to demonstrate about how can we crea ...

  6. AM335x(TQ335x)学习笔记——挂载Ramdisk

    上篇文章中我们已经能够通过u-boot启动内核了,但是没有能够启动成功,从内核的log中可以看出,内核启动失败的原因是没有挂载到root文件系统,本文将使用busybox制作根文件系统并打包成ramd ...

  7. undo日志

    InnoDB’s Undo 前言 Undo log是InnoDB MVCC事务特性的重要组成部分.当我们对记录做了变更操作时就会产生undo记录,Undo记录默认被记录到系统表空间(ibdata)中, ...

  8. 每天学点linux命令--tail,cut,sort,uniq

    tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新, ...

  9. [MySQL-1] mysql error 1101 blob/text column can't have a default value

    在MySQL Query Browser上创建一个含有TEXT类型的字段,创建不成功,报错:mysql error 1101 blob/text column can't have a default ...

  10. 解决:Eclipse导入工程后全是错误,连基本类型都不识别

    当初在大学没时间完成作业时,总是喜欢网上搜一个或者拷贝同学的一个工程过来,导入到Eclipse中却全是红叉,连基本类型都不识别. 当时就纳闷了,难道是天要亡我之心不死?后来慢慢了解了,其实是导入的工程 ...