如何使用Optional<T>实现方法返回可空值而非抛出异常
解决方案
你之前的操作走了弯路,完全不需要修改DemoDTO的任何结构,不管是构造器还是属性都不用动,可选的改法有两种,改动成本都极低:
方案1:返回Optional<DemoDTO>(推荐,Java生态最佳实践)
Optional本身就是用来作为方法返回值、明确标识结果可能为空的容器,不需要侵入DTO的定义。你只需要修改查询方法的返回值,去掉orElseThrow直接返回仓库层的查询结果即可:
public Optional<DemoDTO> findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid); }
这个方案的优势是语义非常明确,强制调用方感知空结果的存在并做对应处理,能有效避免漏判空导致的NPE问题,除了这个方法本身,其他现有代码不需要任何改动,其他模块用到DemoDTO的地方完全不受影响。
方案2:直接返回可空的DemoDTO
如果你不想让调用方适配Optional的API,也可以直接返回null,只需要把orElseThrow替换为orElse(null)即可,建议搭配空值注解提示调用方:
// 可根据你的项目依赖选用javax.annotation.Nullable / org.jetbrains.annotations.Nullable public @Nullable DemoDTO findShallowByUuid(UUID uuid) { return demoRepository.findShallowByUuid(uuid) .orElse(null); }
这个方案的优势是调用方可以沿用之前处理空对象的逻辑,不需要学习Optional的相关API,缺点是如果调用方忽略了空值判断,有触发NPE的风险。
误区说明
你之前尝试修改DemoDTO的构造器参数为Optional<T>完全是多余的操作,Optional仅作为方法返回值的包装容器使用,和DTO本身的字段、构造逻辑没有任何关联,直接回滚所有对DemoDTO的修改即可解决其他模块的报错问题。
内容的提问来源于stack exchange,提问作者user17186249
相关产品推荐
相关产品推荐

