java枚举适合封装正则校验规则,通过内聚“类型+格式约束”,预编译pattern提升性能,支持分组、统一校验、错误分离、动态扩展与配置化开关。

Java 枚举非常适合封装通用正则校验规则,关键在于把“类型 + 格式约束”内聚到枚举常量中,避免规则散落在 DTO、Service 或 Validator 里。它天然支持类型安全、可枚举、易扩展,还能直接携带编译期确定的 Pattern 实例,提升运行时性能和可读性。
枚举内部预编译正则,避免重复创建 Pattern
每个枚举项持有一个 Pattern 实例,在构造时一次性 compile,后续校验直接 matcher().matches(),不重复解析正则字符串:
- 定义时传入标准正则表达式字符串,如
"^1[3-9]\d{9}$"(国内手机号)或"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"(邮箱) - 使用
Pattern.compile(regex)初始化 final 字段,确保线程安全与复用性 - 校验方法统一签名:接受 String 输入,判空 + trim + matches,失败时抛出带上下文的异常
按业务场景分组枚举,支持多字段差异化校验
不同字段需不同规则,可建多个专用枚举,比如:
-
ContactType:区分
EMAIL、PHONENUMBER、WECHAT_ID,各自绑定对应正则 -
IdCardType:支持
CHINA_IDCARD(18位含X)、FOREIGN_PASSPORT(字母+数字组合) -
BankCardType:区分
VISA、MASTER、UNIONPAY的卡号长度与起始位规则
DTO 中只需声明 ContactType type 和 String value,校验时调用 type.validate(value) 即可,无需 if-else 分支。
校验逻辑与错误反馈分离,便于集成 Spring 校验体系
枚举本身只做“是否合规”的布尔判断,错误消息由上层统一处理:
- 枚举 validate 方法可返回 boolean,或抛出运行时异常(如
IllegalArgumentException),由全局@ControllerAdvice捕获并转为标准错误响应 - 若需更细粒度反馈(如“邮箱格式错误” vs “手机号长度不足”),可在枚举中增加
getErrorMessage()方法,返回占位符(如"{type}.format.invalid"),交由 MessageSource 解析国际化文本 - 配合自定义注解(如
@ValidByEnum(enumClass = ContactType.class)),让 Spring 自动触发枚举校验逻辑
支持动态扩展与配置化开关
新增一种联系方式?只需在 ContactType 中加一行:
ALIPAY_ACCOUNT("^2088\d{19}$"), // 支付宝账号以2088开头,共21位- 无需改任何校验代码、DTO 或配置文件,编译即生效
- 如需按租户启用某规则,可在枚举中增加
boolean isEnabled()方法,读取配置中心或环境变量决定是否参与校验链
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











