[方法封装] 提前报错 or 返回空 List - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RedBeanIce
V2EX    Java

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

  •  1
     
  •   RedBeanIce 2022-08-31 17:37:29 +08:00 3248 次点击
    这是一个创建于 1206 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

    两种做法都没问题,自己内部协商好就行。
    chihiro2014
        19
    chihiro2014  
       2022-09-01 01:50:20 +08:00   1
    空 list 或者 optional
    akira
        20
    akira  
       2022-09-01 04:46:42 +08:00   1
    公共方法 不要多管闲事
    nothingistrue
        21
    nothingistrue  
       2022-09-01 09:32:13 +08:00   1
    通过 ID (单个或多个)查询数据,但却没给 ID ,这通常是错误调用,应当抛出异常,但这个异常就仅仅是参数无效异常,并不是提前暴漏出去的错误。

    但是,非通常场景,比如说无需区分结果为空的原因是没给 ID 还是给了 ID 但没对应的数据,那穿个空的 ID 列表就是正常参数,无需抛出异常。

    其实这个的关键还是要看你对 customerIdList 这个参数的定义,是允许空还是不允许空。
    goalidea
        22
    goalidea  
       2022-09-02 14:52:49 +08:00
    根据具体业务
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     841 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 20:08 PVG 04:08 LAX 12:08 JFK 15:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86