(四)OOP规约

  1、避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,

    直接用类名来访问即可

  2、所有的覆写方法必须加@Override注释

  3、相同参数类型,相同业务含义,才可以使用Java的可变参数,避免使用Object

  4、对外暴露的接口签名,原则上不允许修改方法签名,避免对接口调用方产生影响。接口过时

     必须加@Deprecated注释,并清晰地说明采用的新接口或者新服务是什么

  5、不能使用过时的类或方法

  6、Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals

  7、所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较

  8、关于基本数据类型与包装数据类型的使用标准:

    (1)所有的POJO类属性必须使用包装数据类型

    (2)RPC方法的返回值和参数必须使用包装数据类型

    (3)所有的局部变量推荐使用基本数据类型

  9、定义DO/DTO/VO等POJO类时,不要设定任何属性默认值

  10、序列化类新增属性时,请不要修改serialVersionUID值

  11、构造方法里面禁止加入任何有任务逻辑,如果有初始化逻辑,请放在init方法中

  12、POJO类必须写toString(),使用工具类source>generate toString时,如果继承了

    另一个POJO类,注意在前面加一下super.toString

  13、使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查

    否则会有抛IndexOutOfBoundsException的风险

  14、当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,

    便于阅读

  15、类内方法定义顺序依次是:公有方法或保护方法>私有方法>getter/setter方法

  16、setter方法中,参数名称与类成员变量名称一致,this.成员名=参数名。在getter/

    setter方法中,尽量不要增加业务逻辑,增加排查问题难度

  17、循环体内,字符串的联系方式,使用StringBuilder的append方法进行扩展

  18、final可提高程序响应效率,声明成final的情况:

    (1)不需要重新赋值的变量,包括类属性、局部变量

    (2)对象参数前加final 表示不允许修改引用的指向

    (3)类方法确定不允许被重写

  19、慎用Object的clone方法来拷贝对象

  20、类成员与方法访问控制从严:

    (1)如果不允许外部直接通过new来创建对象,那么构造方法必须是private

    (2)工具类不允许有public 或 default构造方法

    (3)类非static成员变量并且与子类共享,必须是protected

    (4)类非static成员变量并且仅在本类使用,必须是private

    (5)类非static成员变量如果仅在本类使用,必须是private

    (6)若是static成员变量,必须考虑是否为final

    (7)类成员方法只供类内部调用,必须是private

    (8)类成员方法只对继承类公开,那么限制为protected

(五)集合处理

  1、Map/Set的key为自定义对象时,必须重写hashCode和equals

  2、ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常:

    java.util.RandomAccessSubList cannot be cast to java.util.ArrayList;

  3、在subList场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、

    删除均产生ConcurrentModificationExceotion异常

  4、使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的

    数组,大小就是list.size()

   5、使用工具类Array.asList()把数组转换成集合时,不能使用其修改集合相关的方法,

    她的add/remove/clear方法会抛出UnsupportedOperationException异常

  6、泛型通配符<? exctends T>来接收返回的数据,此写法的泛型集合不能使用add方法

  7、不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果

    并发操作,需要对Iterator对象加锁

  8、在JDK7版本以上,Comparator要满足自反性,传递性,对称性,不然Arrays.sort,

    Collections.sort会报IllegalArgumentException异常

  9、集合初始化时,尽量指定集合初始值大小

  10、使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历

  11、高度注意Map类集合K/V能不能存储null值的情况:

集合类

Key

Value

Super

说明

Hashtable

 

 

Dictionary

线程安全

ConcurrentHashMap

 

 

AbstractMap

线程局部安全

TreeMap

 

null

AbstractMap

线程不安全

HashMap

null

null

AbstractMap

线程不安全

  12、合理利用好集合的有序性和稳定性避免集合的无序性和不稳定性带来的负面影响

  13、利用Set元素唯一的特性,可以快速对另一个集合进行去重操作,避免使用List的

    contains 方法进行遍历去重操作


出自《阿里巴巴Java开发手册》 喜欢请支持正版