[方法封装] 提前报错 or 返回空 List

2022-08-31 17:37:29 +08:00
 RedBeanIce

我想请问一个问题,假如我 mapper 层有个方法,是根据 customerIdList 查询数据,

现在要在代码的某个地方封装一个公共方法,

这个公共方法,假如有一次查询入参为长度为 0 的 list ,那么这个封装方法应该直接报错,还是也返回一个空 list 呢,

将错误提前暴露出去嘛,直接报错?

2757 次点击
所在节点    Java
22 条回复
Oktfolio
2022-08-31 17:39:39 +08:00
空 list
hidemyself
2022-08-31 17:41:35 +08:00
返回空 list
iovekkk
2022-08-31 17:50:47 +08:00
都行啊,在备注里面写清楚情况说明
要么在方法里面判断入参为空时直接 throw 一个 exception
要么返回一个空 list 或者空值都可以
kop1989smurf
2022-08-31 17:54:54 +08:00
mapper 或者说 dao 层应该返回空数组。因为单例原则,只负责数据呈现,不负责业务。

反之如果在业务层( Biz/service )就要具体问题具体分析了。

假设这个业务是个关键业务,会导致业务的流程异常或者出现难以预测的结果,那么就应该抛出异常。
反之只是一个普通的查询,业务依赖程度不高,也应该返回空集合。
TWorldIsNButThis
2022-08-31 17:56:21 +08:00
如果要报错
那就在编译期解决
目前比较常用的方式是定义 NonEmptyList 类型
ChoateYao
2022-08-31 17:57:42 +08:00
查询操作返回对应的数据类型即可,除非有特殊情况需要对具体字段判断并返回错误信息。
kop1989smurf
2022-08-31 17:57:54 +08:00
勘误:上文“单例原则”应为“单一职责原则”。最近在指导小弟们 UI 页面栈设计模式上的问题,脑子抽了。
chendy
2022-08-31 18:24:04 +08:00
if (customerIdList.isEmpty()) {
return Collections.emptyList();
}
xiaoming1992
2022-08-31 19:32:03 +08:00
从前端来说,抛错或者空 list 都行,只要不给我返回 null 。。。
night98
2022-08-31 20:55:12 +08:00
@chendy #8 还是建议工具类判空,说不准哪个人入参就是 null
lululau
2022-08-31 21:01:36 +08:00
当然是返回 empty list ,抛异常是什么骚操作啊

empty list 的写法:List.of()
ksc010
2022-08-31 21:03:50 +08:00
看返回的空 list 是否是在调用者期望(或者是业务允许)的范围内
dutianze
2022-08-31 22:54:54 +08:00
if(CollectionUtils.isEmpty(customerIdList)) {
throw new RunimeException("xxxx");
}
倾向于异常,入参不对让调用方改
isbase
2022-08-31 23:47:22 +08:00
程序也要考虑下防呆设计比较好
lanlanye
2022-09-01 00:05:41 +08:00
那就综合上面说的,返回空 List ,并且输出一条 Warning
pennai
2022-09-01 00:11:37 +08:00
应该空 List ,dao 层( mapper )不应该抛自定义业务异常,一般都在 Service (或 DDD 的 domain )才抛自定义异常
NeroKamin
2022-09-01 00:49:03 +08:00
```
if (CollectionUtils.isEmpty(list)) {
return List.of();
}
// otherwise
...
```
Rocketer
2022-09-01 01:45:10 +08:00
这就是个谁负责处理错误的问题。

如果你要处理这个错误,那就返回空 list 。

如果你想交给调用方处理,那就抛错。

两种做法都没问题,自己内部协商好就行。
chihiro2014
2022-09-01 01:50:20 +08:00
空 list 或者 optional
akira
2022-09-01 04:46:42 +08:00
公共方法 不要多管闲事

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876782

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX