一、命名
1.类名、方法名、参数名、成员变量、局部变量都统一使用如lowerCamelCase的驼峰形式。
2.常量名全部大写。
3.枚举类成员名称全部大写。
二、常量定义
1.不允许任何魔法值直接出现在代码中。
2.如果变量值有确定的范围变化,且带有名称之外的延伸属性,定义为枚举类。
三、OOP规约
1.所有的覆写方法,必须加@Override注解
2.相同参数类型,相同业务含义才可以使用Java的可变参数,避免使用Object。
3.接口废弃过时需要添加@Depreated注解。不能使用过时的类或方法。
4.Object的equals方法容易抛空指针异常,确保有值的对象才可以调用。
5.相同类型的包装类对象之间值的比较使用equals方法。
6.在循环体中使用StringBuilder的append方法进行字符串连接。
7.final声明类、成员变量、方法、以及本地变量
(1)不允许被继承
(2)不允许修改成员变量的引用地址
(3)不允许被重写
(4)不允许重新赋值。只能重新定义变量
四、集合处理
1.只要重写equals,就必须重写hashCode。如果自定义对象作为map的键,则必须重写。
2.泛型通配符
(1)<? extends T>接收、读取返回的数据,该写法的泛型集合不能使用add方法。
(2)<? super T>存取、插入数据,不能使用get方法。
3.comparator比较时需要满足以下三个条件
(1)x,y的比较结果和y,x的比较结果相反。
(2)x > y,y > z,则x > z。
(3)x = y,则x ,z比较结果和y,z比较结果相同。
4.集合初始化时,指定集合初始值大小。例如HashMap(int initialCapacity),
initialCapacity=(需要存储的元素个数/负载因子)+1,负载因子默认为0.75。若无法确定大小,则设置16默认值。
五、并发处理
1.获取单例对象必须保证线程安全。
2.线程池必须手动new ThreadPoolExecutor()构造实例。
3.SimpleDateFormat是线程不安全的类,可以使用DateTimeFormatter来代替。
4.多线程并行处理定时任务时,使用ScheduledExecutorService不会在抛出异常后终止其他任务;而使用Timer+TimeTask,抛出异常后会终止其他任务。
5.一写多读用volatile,可以解决多线程内存可见性。LongAdder适合高并发海量计数使用。
六、控制语句
1.Switch必须包含default语句。
七、其他注意事项
1.获取整数类型的随机数,使用Random对象的nextInt/nextLong方法。
2.获取当前毫秒数使用System.currentTimeMillis();而不是new Date().getTime();统计时间使用Instant类。
八、异常处理
1.try-catch捕获异常时必须处理异常,而不是什么都不处理。
2.try-catch放到了事务代码中,如果需要回滚事务则需手动回滚。
九、安全规约
1.敏感数据禁止直接展示,必须做脱敏处理。
十、MySQL数据库
1.主键索引名为 pk_字段名;唯一索引名为 uk_字段名;普通索引名则为 idx_字段名。
2.小数类型为 decimal,禁止使用 float 和 double。
十一、ORM映射
1.在表查询时,指定查询字段,不要使用*作为查询的字段列表。