Java开发手册学习
一、命名规则
- 禁止下划线或💲开始或结束
- 常量全部大写
- 抽象类用Abstract或Base开头,异常类用Exception结尾,测试类用他要测试的类的名称开始,以Test结尾
- POJO类中布尔类型的数据不要加is前缀
- 设计模式需要体现具体设计模式
- 接口类中的方法和属性不要加任何修饰符号,尽量不要定义变量,如果要定义,那么一定是和接口方法相关的。如果在接口中定义变量,那么一定是** public static final**的
- 枚举类需要带上Enum后缀,枚举成员变量名称需要全大写,单词间用下划线隔开。枚举类是特殊的类,其域成员均为常量,构造方法默认强制私有
- 各层的命名规约:
Service/DAO层方法命名规约
- 获取单个对象的方法用get做前缀。
- 获取多个对象的方法用list做前缀,复数形式结尾如:listObjects。
- 获取统计值的方法用count做前缀。
- 插入的方法用save/insert做前缀。
- 删除的方法用remove/delete做前缀。
- 修改的方法用update做前缀。
领域模型命名规约
- 数据对象:xxxDO,xxx即为数据表名。
- 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
- 展示对象:xxxVO,xxx一般为网页名称。
- POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。
二、常量定义
- 不允许在代码中直接定义常量
- 在给long或者Long类型变量赋值的时候,要在数值之后加大写的L
- 不要使用一个常量类要维护所有的常量,要按照常量的功能进行归类
三、代码格式
- 大括号的使用方法:
- 左大括号前不换行。
- 左大括号后换行。
- 右大括号前换行。
- 右大括号后还有else等代码则不换行;表示终止的右大括号后必须换行
- 左小括号和字符之间不出现空格,右小括号和字符之间不出现空格
- if / for / while / switch / do 等保留字与括号之间必须加空格
- 任何二目、三目运算符的左右两边都必须加空格
- 双斜线的注释和注释内容之间必须有且仅有一个空格
- 单行超过120行需要换行,第二行比第一行缩进4个字符,后面不再缩进,运算符/方法调用的点与下文一起换行,方法调用多个参数的时候在逗号之后换行
- 一个方法多个参数的时候需要在参数的逗号后面添加空格
- 单个方法的总行数不超过80行
四、OOP规约
- 访问一个类的静态变量或者方法直接使用类名访问
- 所有的覆写方法均使用@Override注解,便于判断覆写是否成功
- 接口过时使用@Deprecated注解,同时说明新接口或者新服务是什么
- 不能使用过时的类或者方法
- Object的equal()方法可能存在空指针问题,因此一般使用
"abc".equals(object)
来进行比较。 - 所有包装类型全部使用equals()方法进行比较,Integer对象在-128-127的时候使用==能够得到正确结果,但是在这之外的数字使用==将无法得到正确结果
- POJO类必须写toString()方法,如果是继承另一个类,那么就在前面加一个
super.toString()
- split()的结果需要对最后一个进行检查,否则可能会有越界风险
- 一个类如果有多个构造方法/同名方法需要放在一起,类里面的方法的定义顺序是公有方法/保护方法>私有方法>getter/setter方法
- setter方法中不添加额外逻辑,只进行赋值
- 字符串连接使用StringBuilder对象,加快速度
- Object的clone方法是浅拷贝,慎用
- 类成员之间访问要很严格,方便解耦:
- 如果不允许外部使用new来创建对象,那么构造方法为private
- 工具类不允许有public或者default构造方法
- 类非static成员变量并且与子类共享,必须为protectd
- 类非static成员变量只在本类里面使用那么必须为private
- 类static变量如果仅在本类使用那么必须是private
- 类中含有static变量考虑其是否能够改为final
- 类成员方法只供内部调用必须为private
- 类成员方法只对继承类公开那么限制为protectd
五、集合处理
- 如果要重写equals方法那么必须重写hashCode方法,使用Set保存的对象必须重写hashCode和equals方法,Map的key必须要重写这两个方法(hashCode相等不一定equals返回true,就像HashMap中使用hashCode方法来找到同一个地方,然后使用equals方法来找到相同的元素)
- 集合转数组必须要使用集合的toArray()方法,传入的是类型完全一样的数组,大小为list.size()
- 使用Arrays.asList()把数组转为集合的时候不能使用集合相关的方法,asList()方法返回的是Arrays的一个内部类,后部数据仍然为数组,如果修改数组中的值,那么list中的值也会发生变化
- 不要在for each循环中尽心该元素的add()/remove()操作,使用迭代器Iterator方式进行操作,如果是并发操作的时候那么需要对Iterator对象加锁。
- 集合初始化的时候指定初始值大小,避免resize消耗大量时间
- 集合遍历尽量使用entrySet进行Map遍历,提高效率
六、 并发处理
//todo
七、控制语句
- switch语句要使用break/return停止,每一个switch中必须包含default语句
- if / else / for / while / do 语句中必须使用大括号,即使只有一行代码
- 在高并发场景中避免使用等于做为推出条件,应该使用大于或者小于进行判断(如果一个秒杀场景中使用商品数==0做为判断条件,在高并发场景下有可能会出现商品数由于并发变成负数而无法停止的情况
- 在表达异常的分支的时候,少用if-else。如果if-else的层数较深,那么直接使用卫语句的方式
- 循环体中的语句要考虑性能,要尽量把定义对象、变量、获取数据库连接等操作放到循环体外面,考虑能够将try-catch放到循环体之外
- 避免使用取反运算符
- 调用频次低的方法、执行时间长的方法、需要极高稳定性的方法、对外的接口、敏感权限的入口需要进行参数校验
八、 注释规约
- 类、类属性、类方法使用javadoc规范进行注释
- 所有抽象方法要使用javadoc注释,所有的类必须要添加创建者和创建日期
- 所有枚举类型字段都要有注释
九、其他
- 正则表达式的时候使用预编译功能
- Math.random()方法将会返回一个double类型,尽量使用Random的nextInt和next Long方法
- 获取时间尽量使用System.currentTimeMillis()或者System.nanoTime()方法,在jdk8中推荐使用Instant类
- 不要在视图模版中添加复杂逻辑操作
- 数据结构的初始化应该指定大小