18

为什么阿里巴巴开发手册中强制要求接口返回值不允许使用枚举?

 5 years ago
source link: https://mp.weixin.qq.com/s/VftRDpoe60WWb5n43GM7FQ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

点击上方“ dotNET全栈开发 ”,“ 设为星标

加“ 星标 ”, 每天21.45, 好文必达

在阅读《阿里巴巴Java开发手册》时,发现有一条关于二方库依赖中接口返回值不允许使用枚举类型的规约,具体内容如下:

在谈论为什么之前先来科普下什么是二方库, 二方库 也称作二方包,一般指公司内部发布到中央仓库,可供公司内部其他应用依赖的库(jar 包)。

那么 一方库 便是本工程内部子项目模块依赖的库; 三方库 为公司之外的开源库,比如像 fastjson、easyexcel 这种。

下面我们就通过一个例子来看下为什么阿里巴巴不允许返回枚举类型或者包含枚举类型的 POJO 对象。

比如星巴克提供了 0.0.1 版本的二方库,定义了一个 Starbucks 类,里面包含了枚举类型的 SizeEnum ,里面分别是中杯、大杯、特大杯。

public class Starbucks implements Serializable {
private Long id;
private String name;
private Integer capacity;
private SizeEnum sizeEum;
}

public enum SizeEnum {
TALL(1),
GRANDE(2),
VENTI(3)
}

定义了一个服务类,实现了根据 id 获取星巴克的方法:

public class StarbucksImpl implements StarbucksService {
public Starbucks getStarbucksById(Long id) {
Starbucks starbucks = new Starbucks();
starbucks.setId(1L);
starbucks.setName("Latte");
starbucks.setCapacity(360);
starbucks.setSizeEnum(SizeEnum.TALL);
return starbucks;
}
}

然后,星巴克的门店引入 0.0.1 这个版本 jar 包,然后卖的好好的:

public class StarbucksDemo {
@Resource
private StarbucksService starbucksService;

public void getStarbucks() {
Starbucks starbucks = starbucksService.getStarbucksById(1L);
System.out.println(starbucks);
}
}

有一天,老罗说要那个中等大小的中杯拿铁,但是服务员说那是大杯,经过一番争论,罗老师很是生气。

BVRJ3eQ.gif

于是星巴克升级到了 0.0.2 版本二方库,在枚举类 SizeEnum 中新增了小杯,升级后的枚举类如下:

public enum SizeEnum {
TALL(1),
GRANDE(2),
VENTI(3),
SHORT(4)
}

同时服务类的接口方法也做了相应修改:

public class StarbucksImpl implements StarbucksService {
public Starbucks getStarbucksById(Long id) {
Starbucks starbucks = new Starbucks();
starbucks.setId(1L);
starbucks.setName("Latte");
starbucks.setCapacity(240);
starbucks.setSizeEnum(SizeEnum.SHORT);
return starbucks;
}
}

由于星巴克的门店比较多,有的还不知道这个新加的需求,因此返回结果中出现了 SHORT ,但是 0.0.1 版本的二方库中没有小杯啊,所以就出问题了,也就是序列化失败。

通过这个例子,我相信大家对枚举类型作为返回结果有了一定的理解,下面引用孤尽大佬在知乎的回答:

由于升级原因,导致双方的枚举类不尽相同,在接口解析,类反序列化时出现异常。

Java 中出现的任何元素,在 Gosling 的角度都会有背后的思考和逻辑(尽管并非绝对完美,但 Java 的顶层抽象已经是天才级了),比如:接口、抽象类、注解、和本文提到的枚举。枚举有好处,类型安全,清晰直接,还可以使用等号来判断,也可以用在 switch 中。它的劣势也是明显的,就是不要扩展。可是为什么在返回值和参数进行了区分呢,如果不兼容,那么两个都有问题,怎么允许参数可以有枚举。当时的考虑,如果参数也不能用,那么枚举几乎无用武之地了。参数输出,毕竟是本地决定的,你本地有的,传送过去,向前兼容是不会有问题的。但如果是接口返回,就比较恶心了,因为解析回来的这个枚举值,可能本地还没有,这时就会抛出序列化异常。

比如:你的本地枚举类,有一个天气 Enum:SUNNY, RAINY, CLOUDY,如果根据天气计算心情的方法:guess(WeatcherEnum xx),传入这三个值都是可以的。返回值:Weather guess(参数),那么对方运算后,返回一个 SNOWY,本地枚举里没有这个值,傻眼了。

总结

本文通过一个实例让大家理解到枚举类型作为返回结果的坑,大家可以使用基本类型或者基本类型包装类来替换掉枚举类型就可以避免掉这么问题了。

大家对于这条规约有什么看法,也欢迎留言讨论。

最好的关系就是互相成就,大家的 在看、转发、留言 三连就是我创作的最大动力。

参考 《Java开发手册》泰山版

https://www.zhihu.com/question/52760637/answer/338584321

推荐阅读

规范 为什么阿里巴巴规定超过3张表禁止JOIN?

转载 面试官:工作3年,你连 .NET 内存泄露都不知道!

神器 下载速度6MB/s,超稳定不崩盘,全面替代Pandownload

转载 用 float 存储金额,老板说损失从工资里扣!

神器   开源神器:你的微信头像可以卡通化了

开源   可以查看微信访客记录!这款神器你知道吗?

微信后台回复“core”,获取全网最强.NET Core学习资料精选

回复“实战”,获取20套实战成品项目源码

回复“进群”,可加入dotnet core开发者交流群

v6feYfn.png!web

.NET Core已经崛起

长按关注,刷新认知

dotNet全栈开发


Recommend

  • 95
    • down.51cto.com 7 years ago
    • Cache

    阿里巴巴Java开发手册--终极版

    阿里巴巴集团推出的《阿里巴巴Java开发手册》是阿里巴巴近万名开发同学集体智慧的结晶,以开发视角为中心,详细列举如何开发更加高效、更加容错、更加有协作性,力求知其然,更知其不然,结合正反例,让Java开发者能够提升协作效..

  • 44

    前言 只有光头才能变强 前一阵子一直在学Redis,结果在黄金段位被虐了,暂时升不了段位了,每天都拿不到首胜(好烦)。 趁着学校校运会,合理地给自己放了一个小长假,然后就回家了。回到家才发现当时618买了一堆书,这堆书还有没撕包装的呢....于是我翻出了最

  • 58
    • 掘金 juejin.im 6 years ago
    • Cache

    阿里巴巴Java开发手册阅读笔记

    前言 参考:阿里巴巴Java开发手册V1.3.0 总结比较重要的,对面试有用的开发规约 一、编程规约 (一)命名风格 【强制】POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型 Boolean is

  • 55
    • 掘金 juejin.im 6 years ago
    • Cache

    阿里巴巴Android开发手册

    前言 代码是一个程序猿的门面,有门面的程序猿才是一个好程序猿。 本文节选自阿里巴巴开发手册,下载地址 本手册以开发者为中心视角分为Java语言规范(遵循《阿里巴巴Java开发手册》), Android 资源文件命名与使用,Android 基本组件,UI 与布局

  • 20

    在阅读《阿里巴巴Java开发手册》时,发现有一条关于关于常量定义的规约,具体内容如下: 图中的反例是将数据缓存起来,并使用魔法值...

  • 26

    之前已经详细、全面地介绍了 Log4j,相信小伙伴们已经完全掌握了。那我在读嵩山版的阿里巴巴开发手册(没有的小伙伴,记着找我要)的时候,就发现了一条「强制」性质的日志规约: 应用中不可以直接使用日志系统(Log4j、Logback)中的 API...

  • 12

    为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回? 武培轩 2020年09月11日 147次浏览 在阅读《阿里巴巴Java...

  • 6

    为什么阿里巴巴强制要求使用包装类型定义属性?-HollisChuang's BlogGitHub 19k Star 的Java工程师成神之路,不来了解一下吗! 在阿里巴巴Java开发手册中,对于POJO中如何选择变...

  • 3

    封面:学校内的秋天背景:写这个的原因,也是我这两天凑巧看到的,虽然我一直有 alibaba Java 开发手册,也看过不少次,但是一直没有注意过这个问题?属于那种看过,但又没完全看过?

  • 3

    阿里巴巴为什么这样强制从List中删除元素 还是先举个...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK