改善java程序的151个建议 对后感二
建议9:少用静态导入
使用静态导入给程序带来的坏味道。静态导入后,代码中就不用再写类名,但是我们知道类是“一类事物的描述”,缺少了类名的修饰,静态属性和静态方法的
表象意义可以被无线放大,这会让阅读者很难弄清楚其属性或者方法代表何意。特别是在一个类中有多个静态导入语句时,若还使用了*(星号)通配符,
把一个类的所有静态属性都导入进来,那简直是恶梦。
当然静态导入也是有好处的,比如需要使用java.lang.Math类中的PI(圆周率),就可以 import static java.lang.Math.PI 以此避免在方法中频繁的出现 Math 类名
所以,对于静态导入,一定要遵循两个规则:
a:不使用*(星号)通配符,除非是导入静态常量类(只包含常量的类和接口)
b:方法名是具有明确、清晰表象意义的工具类(即,通过方法名就可看出是哪个类的方法)
建议10:不要在本类中覆盖静态导入的变量和方法
如何在本类中覆盖了导入的静态变量和方法,编译器(IDE)不会报错,但是这是程序的可读性较差。
建议11:养成良好习惯,显式声明UID
一个javaBean实现了Serializable接口,这事变异器回弹出一个警告,(实现 Serializable接口 就可以在网络上传输,也可以在本地存储然后读取)
建议9:少用静态导入
使用静态导入给程序带来的坏味道。静态导入后,代码中就不用再写类名,但是我们知道类是“一类事物的描述”,缺少了类名的修饰,静态属性和静态方法的
表象意义可以被无线放大,这会让阅读者很难弄清楚其属性或者方法代表何意。特别是在一个类中有多个静态导入语句时,若还使用了*(星号)通配符,
把一个类的所有静态属性都导入进来,那简直是恶梦。
当然静态导入也是有好处的,比如需要使用java.lang.Math类中的PI(圆周率),就可以 import static java.lang.Math.PI 以此避免在方法中频繁的出现 Math 类名
所以,对于静态导入,一定要遵循两个规则:
a:不使用*(星号)通配符,除非是导入静态常量类(只包含常量的类和接口)
b:方法名是具有明确、清晰表象意义的工具类(即,通过方法名就可看出是哪个类的方法)
建议10:不要在本类中覆盖静态导入的变量和方法
如何在本类中覆盖了导入的静态变量和方法,编译器(IDE)不会报错,但是这是程序的可读性较差。
建议11:养成良好习惯,显式声明UID
一个javaBean实现了Serializable接口,这事变异器回弹出一个警告,(实现 Serializable接口 就可以在网络上传输,也可以在本地存储然后读取)
警告内容是
点击 Add generated serial version ID,会在类里看见这样一行代码,如下
private static final long serialVersionUID = -1627954189482099197L;
如果不点击Add generated serial version ID,你的编译器在编译的时候帮我生成。生成的依据是通过包名,类名,继承关系,非私有的方法和属性,以及参数、返回值等诸多因子计算出来的,极度复杂,基本上计算出来的这个值是唯一的。
知道serialVersionID是如何生成的,下面来看看 serialVersionID 的作用。JVM在反序列化时,会比较数据流中的serialVersionID与类的serialVersionID是否相同,如果相同,则认为类没有发生,可以把数据流load为实例对象;如果不相同,对不起,我JVM不干了,抛个异常InvalidClassException给你瞧瞧。这是一个非常好的校验机制,可以保证一个对象即使在网络或磁盘中“滚过”一次,仍能做到“出淤泥而不染”,完美地实现类的一致性。但是,有时候我们需要一点特例场景,例如:我的类改变不大,JVM是否可以把我以前的对象反序列过来?就是依靠显式声明serialVersionID,向JVM撒谎说“我的类版本没有变更”,如此,我们编写的类就实现了兼容。
注意:显示声明serialVersionID可以避免对象不一致,但尽量不要以这种方式向JVM“撒谎”