某支付项目实施的技术规范实践:
★ Object.equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals方法。推荐使用 java.util.Objects的equals方法(JDK7 引入的工具类)。
★ 关于基本数据类型与包装数据类型的使用标准如下:
1) 所有的 POJO 类属性必须使用包装数据类型。
2) RPC 方法的返回值和参数必须使用包装数据类型。
3) 所有的局部变量推荐使用基本数据类型。
★ 序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
★ 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
★ 使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会有抛 IndexOutOfBoundsException 的风险。
★ Map/Set 的 key 为自定义对象时,必须重写 hashCode 和 equals 。
★ 通过 foreach 循环进行集合遍历时不要进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。
★ 使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历,前者效率高。
★ 利用 Set 元素唯一的特性,可以快速对另一个集合进行去重操作,避免使用 List 的contains 方法进行遍历去重操作。
★ SimpleDateFormat 是线程不安全的类,一般不要定义为 static 全局变量,方法内的局部变量没问题。
★ 并发修改同一记录时,避免更新丢失,要么在应用层加锁,要么在数据库层使用乐观锁,使用 version 作为更新依据。
★ 对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性等要坚决从程序中清理出去,避免造成过多垃圾。
★ xml 配置中参数注意使用:#{},#param# 不要使用${} 此种方式容易出现 SQL 注入。
★ 不要写一个大而全的数据更新接口,传入为 POJO 类,不管是不是自己的目标更新字段,都进行 update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行 SQL 时,尽量不要更新无改动的字段,一是易出错;二是效率低;三是数据库的 binlog 增加存储。
★ 所有的对象(包括基本数据类型的包装类对象)之间值的比较,全部使用equals方法比较,不允许使用==比较。
★ 集合初始化时,尽量指定集合初始值大小,以避免扩容影响效率。
★ 工程直接依赖的jar包,以及间接依赖的jar包,都必须在Maven的pom.xml文件中配置,以避免发生版本不一致的问题。