Java请求校验重构:如何强制创建对象后必须调用指定方法?
编译期强制校验HttpRequire必须调用message()方法的方案
问题场景
你重构请求校验逻辑时,为了提升长条件+长错误消息的代码可读性,设计了Builder风格的HttpRequire类:
public class HttpRequire { public static BuilderMsg require(final boolean value) { return message -> { if (!value) { throw new HttpException(message, HttpStatus.BAD_REQUEST); } }; } public interface BuilderMsg { void message(String message); } }
但存在隐患:如果调用者只写require(condition)而忘记调用message(),校验逻辑永远不会执行,且运行期不会报错。你希望在编译阶段就检测出这种疏漏。
可行解决方案
1. 调整API设计,从根源避免问题
放弃Builder模式,改用重载方法拆分参数,既保证可读性,又无需担心未调用方法的问题:
public class HttpRequire { private HttpRequire() {} // 基础实现 public static void require(boolean condition, String errorMessage) { if (!condition) { throw new HttpException(errorMessage, HttpStatus.BAD_REQUEST); } } // 重载方法,先传错误消息再传条件,提升多行可读性 public static void withMessage(String errorMessage, boolean condition) { require(condition, errorMessage); } }
调用示例(长消息+长条件也清晰):
HttpRequire.withMessage( "用户ID不能为空,且必须是长度为12的数字字符串", userId != null && !userId.isBlank() && userId.matches("\\d{12}") );
2. 静态代码分析工具强制检查
如果坚持使用Builder模式,可以用静态代码分析工具在编译期拦截疏漏:
- IntelliJ IDEA:自定义检查规则,搜索
HttpRequire.require()的调用,判断是否存在后续的.message()调用,若没有则标记错误 - Checkstyle/SpotBugs:编写自定义规则,扫描代码中未链式调用
message()的require()调用,在编译阶段抛出错误
3. 自定义注解处理器(进阶方案)
通过编写自定义注解和注解处理器,实现编译期强制校验:
- 定义注解
@MustCallMethod,标记BuilderMsg.message()方法 - 编写注解处理器,在编译期扫描所有
HttpRequire.require()的调用节点,检查是否存在后续的message()调用,若未调用则抛出编译错误
这种方案需要额外开发,但能彻底解决问题,适合大型项目统一规范。
内容的提问来源于stack exchange,提问作者Serhii Lytvynov
相关产品推荐
相关产品推荐

