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

二方库接口为什么不能使用枚举类型

  •  
  •   t202201 · 2023-01-31 16:35:34 +08:00 · 1859 次点击
    这是一个创建于 665 天前的主题,其中的信息可能已经有所发展或是发生改变。

    阿里的 java 开发手册里有这么一条

    [强制] 二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的 POJO 对象。

    对此不是很理解,目前公司里各个服务调用的时候,用到 enum 的地方很多,也没发现什么问题,今天看到这个,把我整懵了。如果不用 enum ,那用什么替代呢? String 吗,这样子,可读性如何保证呢?

    顺带问一个别的 java 问题,高性能 mysql 书上有写,推荐使用 int 而非 varchar 来存储 ip 地址,但是前不久 leader 特意让我把 int 改成 varchar ,说是为了可读性。我又懵了。有没有大佬帮忙解释一下?

    各位在公司里,实际都是如何操作的呢?

    9 条回复    2023-02-01 15:22:56 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2023-01-31 16:37:30 +08:00
    新增枚举的时候似乎会有序列化的问题, 另外新增枚举还要发版引入新的 client, 不太灵活.

    int 和 char 也好理解, 你省的拿点性能 /存储远远不如可读性带来的好处多.
    optional
        2
    optional  
       2023-01-31 16:53:05 +08:00 via iPhone
    枚举序列化成 string 不就好了
    LeegoYih
        3
    LeegoYih  
       2023-01-31 17:02:27 +08:00
    枚举传 code 值,无论是与客户端交互,还是跨语言 RPC 都友好。

    @Getter
    @AllArgsConstructor
    public enum Status {
    ADDED((short) 0),
    BLOCKED((short) 1),
    REMOVED((short) 2);
    private final short code;
    }

    IP 存 int 格式不影响可读性,用 INET_ATON 和 INET_NTOA 就行
    wudaye
        4
    wudaye  
       2023-01-31 17:37:27 +08:00
    1. 非固定枚举一定不能作为出参,不然你新增一个枚举项并发布,但是调用方引用的枚举类还是旧的,主流 RPC 框架在反序列化的时候都会报错。如果是性别这种固定枚举,保证不更新的,也就无所谓了。2. 对大部分公司项目来说可读性可维护性重要过字段类型带来的极限性能差异
    CEBBCAT
        5
    CEBBCAT  
       2023-01-31 17:41:11 +08:00
    以前感觉阿里的东西都挺自命不凡的,没想到还有眼明心亮的时候。

    枚举可以在代码里面用,因为作用域跑不出这一份二进制,所以具体是多少也不会持久化,只是一个代号而已。

    但假如在 HTTP API 中返回,那么由于接口文档及部署不同步的关系,这个枚举就成了一种标准,如此一来就需要对枚举做一份管理,甚至由于 API 里的枚举没有类型提示,还会和其他地方的枚举混淆视听,增加了沟通成本。

    就像楼上说的,使用 enum 的话,旧程序处理新报文的时候不会报错吗?如果楼主说的是错误代码 404 、501 这种,那谈不上枚举,只是一个“代码”而已。

    说到第二个 IP 改用 VARCHAR 存储的问题,你领导懒呗,或者不愿意暴露不知道 INET_NTOA 的事实,还能有啥解释。举个例子,需要通过 CIDR 过滤,用 VARCHAR 咋个搞?
    codergrowing
        6
    codergrowing  
       2023-01-31 17:42:21 +08:00
    @wudaye #4 还是不要假定「保证不更新」的好,谁知道将来有什么奇葩需求。就拿你举例的性别来说,只定义男 /女吗,Facebook 的 50 多个性别了解一下……
    adoal
        7
    adoal  
       2023-01-31 18:18:52 +08:00
    每看到 ip 地址用 integer 还是 varchar 的问题,就想起 PostgreSQL 原生支持的 inet / cidr 类型。
    Bingchunmoli
        8
    Bingchunmoli  
       2023-01-31 19:19:33 +08:00 via Android
    大多数人是不会纯数字 ip 的,就 ip 已经刷掉很多了
    ql562482472
        9
    ql562482472  
       2023-02-01 15:22:56 +08:00
    enum 序列化成字符串就可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2792 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:15 · PVG 23:15 · LAX 07:15 · JFK 10:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.