二方库接口为什么不能使用枚举类型 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
t202201
V2EX    Java

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

  •  
  •   t202201 Jan 31, 2023 2440 views
    This topic created in 1182 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

    说到第二个 IP 改用 VARCHAR 存储的问题,你领导懒呗,或者不愿意暴露不知道 INET_NTOA 的事实,还能有啥解释。举个例子,需要通过 CIDR 过滤,用 VARCHAR 咋个搞?
    threee333
        6
    threee333  
       Jan 31, 2023
    @wudaye #4 还是不要假定「保证不更新」的好,谁知道将来有什么奇葩需求。就拿你举例的性别来说,只定义男 /女吗,Facebook 的 50 多个性别了解一下……
    adoal
        7
    adoal  
       Jan 31, 2023
    每看到 ip 地址用 integer 还是 varchar 的问题,就想起 PostgreSQL 原生支持的 inet / cidr 类型。
    Bingchunmoli
        8
    Bingchunmoli  
       Jan 31, 2023 via Android
    大多数人是不会纯数字 ip 的,就 ip 已经刷掉很多了
    ql562482472
        9
    ql562482472  
       Feb 1, 2023
    enum 序列化成字符串就可以了
    About     Help     Advertise     Blog     API     FAQ     Solana     3398 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 12:37 PVG 20:37 LAX 05:37 JFK 08:37
    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