Java 开发手册摘要

PPG007 ... 2021-12-27 About 6 min

# Java 开发手册摘要

左小括号和右边相邻字符之间不出现空格,右小括号和左边相邻字符之间也不出现空格,左大括号前需要空格。

if (a == b) {

}
1
2
3

if/for/while/switch/do 等保留字与括号之间必须加空格。

任何二目、三目运算符左右两边都需要加一个空格。

单行字符超过 120 个后需要换行,原则如下:

  • 第二行相对第一行缩进,从第三行开始不再缩进。
  • 运算符、方法调用点符号与下文一起换行。
  • 方法调用多个参数需要换行时,在逗号后进行。
  • 在括号前不要换行。

任何货币金额,以最小货币单位且整数类型来进行存储。

关于基本数据类型和包装数据类型:

  • 所有的 POJO 类属性必须使用包装类。
  • RPC 方法的返回值和参数必须使用包装数据类型。
  • 所有的局部变量使用基本数据类型。

定义 POJO 类时,不要设定任何属性默认值。

不要随意修改 serialVersionUID 字段。

构造方法中禁止加入任何业务逻辑,初始化方法应该放在init方法中。

POJO 类必须写 toString 方法,如果存在继承,则还要在前面添加父类 toString。

使用索引访问 String 的 split 方法得到的数组时,要判断最后一个分隔符后面有没有内容。

类成员与方法访问控制从严:工具类不允许有 public 或 default 构造方法。

日期格式化时,传入 pattern 中表示年份统一用小写 y,YYYY 表示的是 week in which year,意思是当天所在的属于的年份,只要这周跨年,YYYY 返回的就是下一年。

关于 equals 和 hashCode,遵循下面的规则:

  • 只要覆写 equals,就必须覆写 hashCode。
  • Set 存储的对象必须覆写这两个方法。
  • 同理 Map 的键必须重写这两个方法。

在使用 Collectors 类的 toMap 方法转为 Map 集合时,要使用含有参数类型 BinaryOperator 的方法,这是一个函数式接口,继承了 BiFunction 接口,其中的 apply 方法接收两个类型,返回另一个类型。

集合转数组时,必须使用 toArray(T[] array) 方法,传入的是类型一致、长度为 0 的空数组,如果使用无参重载,强转会出现 ClassCastException 异常。

使用 Arrays.asList() 方法将数组转换成集合时,不能修改转换后的数组,会抛出异常。

SimpleDateFormat 线程不安全,一般不要定义为 static,或者加锁,或者使用 DateUtils 工具类。

JDK8 后,使用 Instant 代替 Date,LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat。

需要对多个资源进行加锁时,需要保持一致的加锁顺序,避免死锁。

每次访问冲突概率小于 20%,使用乐观锁,乐观锁的重试次数不小于 3 次。

悲观锁:一锁、二判、三更新、四释放。

Random 实例是线程安全的,但是会由于多线程竞争同一 seed 导致性能下降。JDK7 之后可以直接使用 ThreadLocalRandom。

DCL 单例模式中,单例对象应该是 volatile。

switch 括号中变量类型是 String 时,必须先判断 null。

并发环境中,避免使用“等于”判断作为中断或退出条件。

将复杂的逻辑判断结果赋值给一个有意义的布尔变量名。

不要在其他表达式中插入赋值语句。

避免取反逻辑。

方法内部单行注释,在被注释语句上方另起一行。

待办事项 TODO:标记人,标记时间。表示需要实现但还没有实现的功能。

错误 FIXME:标记人,标记时间。表示某段代码是错误的,而且不能工作。

前后端交互 API 需要明确协议、域名、路径、请求方法、请求内容、状态码、响应体。

body 里带参数时必须设置 Content-Type。

如果返回为空,则返回空数组或空集合。

服务端发生错误时,返回的相应信息必须包含 HTTP 状态码,errorCode、errorMessage、用户提示信息四个部分。

前后端交互的 JSON 中,所有的 key 必须为小驼峰。

超大整数场景,一律使用 String 类型返回。

使用 query 参数时,URL 不能超过 2048 字节。

通过 body 传递内容时也要控制长度。

服务器内部重定向必须使用 forward,外部重定向地址必须使用 URL 统一代理模块生成。

对于 trace/debug/info 级别的日志输出,必须进行日志级别开关的判断。

日志打印时禁止使用 JSON 工具将对象转换为 String,直接调用 toString 即可。

单元测试 AIR 原则:

  • A:Automatic 自动化。
  • I:Independent 独立性。
  • R:Repeatable 可重复。

单元测试用例之间决不能互相调用,也不能依赖执行的先后次序。

单元测试 BCDE 原则:

  • B:Border 边界值测试。
  • C:Correct 正确的输入,并得到预期的结果。
  • D:Design 与设计文档相结合来编写单元测试。
  • E:Error 强制错误信息输入,并得到预期结果。

属于用户个人的页面或者功能必须进行权限控制校验。

用户敏感数据禁止直接展示,必须对展示数据进行脱敏。

用户传入的任何参数必须做有效性验证。

URL 外部重定向传入的目标地址必须执行白名单过滤。

使用平台资源如短信验证码时,必须实现正确的放重放机制,防止过量浪费资源。

数据库中表达是与否概念的字段,必须使用 is_xxx 命名。

表名、字段名必须使用小写字母或数字,禁止数字开头,禁止两个下划线之间只出现数字。

表名不使用复数名词,禁用保留字。

小数类型为 decimal。

如果存储的字符串长度几乎相等,使用 char。

varchar 长度不要超过 5000,大于此值应当使用 text。

分层领域模型规约:

  • DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
  • DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
  • BO(Business Object):业务对象,可以由 Service 层输出的封装业务逻辑的对象。
  • Query:数据查询对象,各层接收上层的查询请求。
  • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
Last update: December 27, 2021 03:30
Contributors: PPG007