枚举很好用啊!为啥阿里不建议返回值用枚举??

简介: 小伙伴说在一次接口定义时,使用了枚举,结果被其它人深深嫌弃,说不好拓展。为什么会被嫌弃呢?我们先来看看阿里开发手册关于枚举使用的建议

来源:zhihu.com/question/52760637


提问

小伙伴说在一次接口定义时,使用了枚举,结果被其它人深深嫌弃,说不好拓展。


为什么会被嫌弃呢?我们先来看看阿里开发手册关于枚举使用的建议

image.png



从手册可以看出,定义和使用枚举,阿里开发手册都是支持的,但是为啥,返回值就要反对了呢?


看看作者孤尽是怎么说的

由于升级原因,导致双方的枚举类不尽相同,在接口解析,类反序列化时出现异常。Java中出现的任何元素,在Gosling的角度都会有背后的思考和逻辑(尽管并非绝对完美,但Java的顶层抽象已经是天才级了),比如:接口、抽象类、注解、和本文提到的枚举。


枚举有好处,类型安全,清晰直接,还可以使用等号来判断,也可以用在switch中。


它的劣势也是明显的,就是不能扩展。可是为什么在返回值和参数进行了区分呢,如果不兼容,那么两个都有问题,怎么允许参数可以有枚举。当时的考虑,如果参数也不能用,那么枚举几乎无用武之地了。


参数输出,毕竟是本地决定的,你本地有的,传送过去,向前兼容是不会有问题的。但如果是接口返回,就比较恶心了,因为解析回来的这个枚举值,可能本地还没有,这时就会抛出序列化异常。


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


不过,另一位网友Brian的回答也很通俗易懂

枚举,就是把已知的全部罗列出来。作为二方/三方库的提供者,我支持什么,你们就是用什么,这样是安全的。库版本升级后我支持了更多,你不知道情况下自然不会使用,反正我不支持的参数你不可能传递给我,所以作为输入,枚举简直就是安全保障。但作为返回值,情况就反过来了。


我先告诉你这些这些可以有,然后你规定这些这些可以有,除此之外都没有。


但是,是我说了算而不是你,所以你的规定狗屁不是。没有仔细看手册(假设有的话)的每一个字,鬼知道升级后的api会返回什么,抛异常的可能性直趋百分百。


相关文章
|
8月前
|
存储 编译器 Shell
【C++基础语法 枚举】解析 C/C++ 中枚举类型大小值
【C++基础语法 枚举】解析 C/C++ 中枚举类型大小值
100 0
|
8月前
|
安全 算法 编译器
【C++基础语法 枚举】C/C++ 中enum枚举量的介绍:介绍enum枚举量在C/C中的作用和使用方法
【C++基础语法 枚举】C/C++ 中enum枚举量的介绍:介绍enum枚举量在C/C中的作用和使用方法
104 2
|
C++
C++ E0167 “const wchar_t *“ 类型的实参与 “BSTR“ 类型的形参不兼容
C++ E0167 “const wchar_t *“ 类型的实参与 “BSTR“ 类型的形参不兼容
158 0
|
5月前
|
JavaScript
给原始数据类型加属性和方法为什么不会报错?包装类——阿里面试题
给原始数据类型加属性和方法为什么不会报错?包装类——阿里面试题
|
7月前
|
编译器 C语言
C语言枚举:深入探索下标默认值、自定义值及部分自定义情况
C语言枚举:深入探索下标默认值、自定义值及部分自定义情况
|
7月前
详细解读COM中集合和枚举器笔记(2)枚举器内部实现
详细解读COM中集合和枚举器笔记(2)枚举器内部实现
26 0
|
8月前
|
缓存 自然语言处理 Java
还在为字典值、枚举值校验烦恼吗,不妨试试这个
本文介绍了如何在Java中实现常量值校验的封装,主要包括两个方面:字典值类型的校验和枚举类型的校验。首先,作者提到在进行数据验证时,实体类字段需要添加`@Valid`注解。然后,对于字典值类型的校验,可以通过`@DictVaild`注解检查当前字段值是否在数据库中的字典值类别内,或者与预定义的枚举类中的值相匹配。在进行校验时,可以设置`dictType`参数为`DictType.CODE`或`DictType.LABEL`来分别验证代码值或标签值。
163 0
|
8月前
|
存储 C#
C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析
方法是一段代码,只有在调用时才会运行。 您可以将数据(称为参数)传递给方法。 方法用于执行某些操作,也被称为函数。 为什么使用方法?为了重用代码:定义一次代码,然后多次使用。
157 0
|
存储 编译器 Linux
关于枚举常量手误带来的错误
关于枚举常量手误带来的错误
120 0
|
Java 编译器
重载的方法能否根据返回类型进行区分?
重载的方法不能根据返回类型进行区分。方法的重载是基于方法名称和参数列表来进行区分的,与返回类型无关。这是因为在Java中,编译器在确定要调用哪个重载方法时,仅根据传递给方法的参数来进行决策。
386 0

热门文章

最新文章