抽象类是统一字段验证逻辑的自然载体,强制子类实现validate()方法,封装异常包装、空值预检、字段提取等通用能力,子类专注业务规则,结合注解驱动实现零侵入、可扩展的校验体系。

抽象类是统一字段验证逻辑最自然的载体——它既能强制子类实现校验规则,又能封装共用初始化、错误处理和辅助方法,避免每个验证器重复造轮子。
定义抽象验证器基类,约定核心行为
所有验证器必须实现 validate() 方法,这是合法性检查的唯一入口。抽象类不关心具体规则(比如邮箱怎么写、身份证几位),只规定“你得能校验”。同时可提供通用能力,例如:
- 统一异常包装:把原始校验失败转为标准 ServiceException 或 ConstraintViolationException
- 空值预检:在调用具体逻辑前自动跳过 null 或空字符串,避免子类反复判空
- 字段值提取工具:通过反射或工具类(如 ValidatorUtil.getValue)安全获取 bean 中字段值
让每个校验器继承并专注自身规则
子类只需聚焦业务语义,不用操心流程和边界。例如:
-
EmailValidator:只写
PatternUtil.patternEmail(value.toString()) - IdCardValidator:只写 18 位数字+校验码逻辑
- RangeNumberValidator:只比对数值是否在 min/max 区间内
它们都继承同一个抽象类,因此天然兼容统一调用方式,比如工厂根据注解 @Email 返回 EmailValidator 实例,无需 if-else 判断类型。
结合注解驱动,实现零侵入校验
在字段上加自定义注解(如 @Email(message = "邮箱格式错误")),再通过反射扫描字段及其注解,匹配对应验证器。抽象类在此处起关键作用:
- 注解的
validator属性指向具体验证器类(如EmailValidator.class),而该类必须继承抽象基类,编译期即保证类型安全 - 校验主逻辑(如 ValidateUtils)只依赖抽象类类型,不耦合任何具体实现,新增一个
DateValidator只需写子类 + 注解绑定,无需改主流程
利用抽象构造器统一初始化基础依赖
如果验证器需要共享资源(如正则编译器、配置中心客户端、日志器),可在抽象类构造器中一次性注入并设为 final:
- 避免子类各自 new 同一个对象,节省资源
- 参数校验(如非空、超时值 > 0)集中管控,防止子类传错
- 子类构造器只需
super(logger, config),干净利落










