如何在Java中减少重复错误处理?多类型对象场景实现方案
封装空值校验逻辑的实现方案
针对你代码里重复的空值校验+日志+抛异常逻辑,可以利用Java的泛型和函数式接口实现通用封装,不用因对象类型不同写重复方法。
1. 定义通用工具方法
创建工具类ValidationUtils,把核心校验逻辑封装进去:
import org.apache.commons.lang3.ObjectUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.function.Supplier; public class ValidationUtils { private static final Logger log = LoggerFactory.getLogger(ValidationUtils.class); /** * 校验对象非空,为空则打日志并抛出指定异常 * @param target 要校验的目标对象 * @param errorMsgSupplier 动态生成错误日志的提供者(支持拼接上下文信息) * @param exceptionSupplier 要抛出的异常提供者 * @param <T> 目标对象的类型 * @return 非空的目标对象 */ public static <T> T requireNonNull(T target, Supplier<String> errorMsgSupplier, Supplier<? extends RuntimeException> exceptionSupplier) { if (ObjectUtils.isEmpty(target)) { String errorMsg = errorMsgSupplier.get(); log.error(errorMsg); throw exceptionSupplier.get(); } return target; } // 重载方法:针对常用的固定异常场景,简化调用 public static <T> T requireNonNull(T target, Supplier<String> errorMsgSupplier) { return requireNonNull(target, errorMsgSupplier, () -> new RuntimeException("xyz")); } }
2. 在业务代码中调用
不管是teachers还是students,甚至其他类型对象,都用同一个方法校验:
// 校验教师列表非空 List<Teacher> teachers = ValidationUtils.requireNonNull( school.getTeachers(), () -> "cannot find teachers in school " + school.getSchoolName() ); // 校验学生列表非空 List<Student> students = ValidationUtils.requireNonNull( teachers.getStudents(), () -> "cannot find students in school " + school.getSchoolName() );
方案优势
- 泛型
<T>支持任意类型对象,无需为每种类型单独写校验方法 - 函数式
Supplier允许动态生成错误信息和异常,灵活适配不同上下文 - 核心逻辑只维护一次,后续修改只需调整工具类,符合代码复用原则
内容的提问来源于stack exchange,提问作者bob
相关产品推荐
相关产品推荐

