V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RedBeanIce
V2EX  ›  Java

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

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

    我想请问一个问题,假如我 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
    查询操作返回对应的数据类型即可,除非有特殊情况需要对具体字段判断并返回错误信息。
    kop1989smurf
        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  
       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   ·   实用小工具   ·   5985 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 03:17 · PVG 11:17 · LAX 19:17 · JFK 22:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.