Java编程规范(简约版)
文章目录
- 1、方法长度限制50行内,复杂逻辑采用总分编码或设计模式
- 2、命名规范,见名知义,禁止随意缩写与拼音
- 3、尽早返回,减少嵌套层级,提高代码可读性
- 4、方法参数限制不超过5哥,过多参数封装为POJI对象
- 5、Spring @Transactional事务注解正确使用
- 6、代码逻辑复用,减少重复,提高可维护性
- 7、共享对象与线程安全
- 8、大内存场景务必确保数量有限性,避免OOM
- 9、单元测试,明确用例设计,逻辑全覆盖
- 10、日志规范、格式统一、合理级别与内容管控
1、方法长度限制50行内,复杂逻辑采用总分编码或设计模式
- 单一职责:一个方法只做一件事,不超过50行
- 总分结构:主方法统筹,子方法实现业务细节
- 设计模式:策略、模板方法解决复杂逻辑,提升复用性与扩展性
Java中的策略模式和模板方法模式,可以查看往期内容详解Java中的策略模式和模板方法模式
2、命名规范,见名知义,禁止随意缩写与拼音
- 包:全小写,点分隔(com.company.project)
- 类:首字母大写驼峰,名词单数(UserService)
- 方法:首字母小写驼峰,动词(calculatePrice())
- 变量:首字母小写驼峰,名称(originalPrice)
- 常量:全大写,下划线分隔(MAX_VALUE)
- 避坑:POJO布尔变量不加is前缀
3、尽早返回,减少嵌套层级,提高代码可读性
- 边界优先:数据校验和异常情况先处理,尽早return
- 去除嵌套:消灭多层if-else迷宫,每个if就是一个岔路口,尽量让代码沿主干道前进
- 控制层次:代码结构如阶梯,不宜过深
4、方法参数限制不超过5哥,过多参数封装为POJI对象
- 五指原则:参数不超过一只手的数量
- 封装转换:多参数->POJO对象
- 构建模式:关键的参数用构造器,非关键参数用setter,或者复杂对象用builder模式
关于构建模式详解:Java 中几种常见的“对象创建/配置”策略
5、Spring @Transactional事务注解正确使用
- 公用方法:Service层所有公共方法添加事务注解,长耗时的方法除外
- 明确异常:显示指定回滚/不回滚异常类型(下方详解)
- 不吞异常:捕获后必须重新抛出
- 代理可见:必须public非final方法
- 避免自调:避免同类内部方法调用导致事务失效(详解)
@Transactional 的默认行为是:只有在抛出 RuntimeException(运行时异常)或其子类(如 NullPointerException、IllegalArgumentException 等)时才会触发事务回滚。
对于 Checked Exception(受检异常),如 IOException、SQLException,默认不会回滚事务。
@Transactional
public void saveData() {// 会回滚throw new RuntimeException("出错了!");
}@Transactional
public void saveData2() throws IOException {// 不会回滚throw new IOException("IO 异常!");
}
常见的写法:
@Transactional(rollbackFor = Throwable.class)
@Transactional(rollbackFor = Exception.class)
区别在于是否包含Error
场景 | 建议 |
---|---|
绝大多数业务代码 | @Transactional(rollbackFor = Exception.class) 就够了,避免误杀 Error (通常 Error 是 JVM 级问题,回滚也救不了) |
你明确想连 Error 也回滚(极罕见) | 用 @Transactional(rollbackFor = Throwable.class) |
6、代码逻辑复用,减少重复,提高可维护性
- 方法复用:相似代码抽为共享方法
- 抽象复用:利用继承和接口提取公共逻辑
- 工具复用:抽取常用工具方法,集中管理复用
- 构造复用:使用构造器或者builder模式创建对象,比米娜重复set方法调用
7、共享对象与线程安全
- 单例无状态:单例对象应保持无状态,特别Spring组件,严禁添加成员变量
- 同步机制:使用同步机制(synchronized/Lock)确保多线程共享对象访问安全
- 警惕危险:SimpleDateFormat、ArrayList、 HashMap等非线程安全类谨慎共享使用
- 安全容器:优先使用线程安全的AQS集合:ConcurrentHashMap等
详解:
1️⃣ “单例无状态”:
- 单例(Singleton):Spring 默认把 @Component、@Service、@Repository、@Controller 等 Bean 做成单例,整个应用只有一份实例。
- 无状态(Stateless):这个 Bean 不保存任何“可变”的成员变量,只提供纯函数式行为。
2️⃣ “严禁添加成员变量”
指的是**“可变”的成员变量**(尤其是与请求、会话、线程相关的数据)。
❌ 反面例子:
@Service
public class OrderService {private Order currentOrder; // 千万别这么干!public void create(Order order) {this.currentOrder = order; // 并发请求会互相覆盖...}
}
由于 Spring 默认单例,currentOrder 会被所有线程共享,高并发下出现数据错乱、线程安全问题。
✅ 正确姿势
用无状态方法:所有数据通过参数传入、返回值传出,不留在对象内部。
确实需要状态?
- 用局部变量(栈私有)
- 或者用 ThreadLocal(慎用)
- 或者把 Bean 的 scope 改成 prototype/request/session(极少用)
8、大内存场景务必确保数量有限性,避免OOM
- 对象池化:设置合理配置,重用高消耗对象(core-size、max-size、keeplive、queue-size)
- 异步队列:使用有界队列,平衡生产消费速度(queue-size)
- 大文件读写:分批读取、及时释放资源(byte buffer-size)
- 大数据处理:分页查询,批量插入(batch-size)
9、单元测试,明确用例设计,逻辑全覆盖
- 测试独立性:单元测试间零依赖
- 覆盖全面:分支、便捷、异常全覆盖
- 明确断言:精准验证预期结果
- 用例多样:正常值、边界值、错误值
10、日志规范、格式统一、合理级别与内容管控
- 性能优先:使用{}替代+拼接日子字符串,提升日志性能
- 隐私保护:敏感信息必须脱敏、摘要
- 大小控制:禁止记录大对象(如图片、文件)避免IO瓶颈
- 级别合理:根据场景合理设置DEBUG/INFO/WARN/ERROR生产环境严禁开启DEBUG
- 框架统一:采用日志门面模式(SLF4J 或JCL)