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

2023-01-31 16:35:34 +08:00
 t202201

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

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

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

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

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

1880 次点击
所在节点    Java
9 条回复
Jooooooooo
2023-01-31 16:37:30 +08:00
新增枚举的时候似乎会有序列化的问题, 另外新增枚举还要发版引入新的 client, 不太灵活.

int 和 char 也好理解, 你省的拿点性能 /存储远远不如可读性带来的好处多.
optional
2023-01-31 16:53:05 +08:00
枚举序列化成 string 不就好了
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
2023-01-31 17:37:27 +08:00
1. 非固定枚举一定不能作为出参,不然你新增一个枚举项并发布,但是调用方引用的枚举类还是旧的,主流 RPC 框架在反序列化的时候都会报错。如果是性别这种固定枚举,保证不更新的,也就无所谓了。2. 对大部分公司项目来说可读性可维护性重要过字段类型带来的极限性能差异
CEBBCAT
2023-01-31 17:41:11 +08:00
以前感觉阿里的东西都挺自命不凡的,没想到还有眼明心亮的时候。

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

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

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

说到第二个 IP 改用 VARCHAR 存储的问题,你领导懒呗,或者不愿意暴露不知道 INET_NTOA 的事实,还能有啥解释。举个例子,需要通过 CIDR 过滤,用 VARCHAR 咋个搞?
codergrowing
2023-01-31 17:42:21 +08:00
@wudaye #4 还是不要假定「保证不更新」的好,谁知道将来有什么奇葩需求。就拿你举例的性别来说,只定义男 /女吗,Facebook 的 50 多个性别了解一下……
adoal
2023-01-31 18:18:52 +08:00
每看到 ip 地址用 integer 还是 varchar 的问题,就想起 PostgreSQL 原生支持的 inet / cidr 类型。
Bingchunmoli
2023-01-31 19:19:33 +08:00
大多数人是不会纯数字 ip 的,就 ip 已经刷掉很多了
ql562482472
2023-02-01 15:22:56 +08:00
enum 序列化成字符串就可以了

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

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

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

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

© 2021 V2EX