来源:zhihu.com/question/52760637提问小伙伴说在一个接口定义中使用了枚举,结果却被别人深恶痛绝,而且不好扩展。你为什么会被讨厌?我们先来看看阿里开发手册对枚举使用的建议。从手册中可以看出,阿里开发手册是支持枚举的定义和使用的,但是为什么要反对返回值呢?看看作者是怎么说的。由于升级,双方的枚举类不一样,在解析接口和反序列化类时出现异常。Java中出现的任何元素,在Gosling看来,都会有其背后的思考和逻辑(虽然不是绝对完美,但Java的顶级抽象已经是天才级别),例如:接口、抽象类、注解、以及本文中提到的列举。枚举好,类型安全,清晰直接,也可以用等号判断,也可以用在switch中。它的缺点也很明显,就是不能扩展。但是为什么要区分返回值和参数呢?如果它们不兼容,则两者都有问题。如何枚举参数。当时考虑,如果参数不能用,那枚举就几乎没用了。毕竟参数输出是本地确定的。如果本地有,可以发过去,向前兼容不会有问题。但是如果是接口返回的,就比较恶心了,因为解析出来的枚举值本地可能不存在,这时候会抛出序列化异常。比如:你本地的枚举类有一个天气Enum:SUNNY,RAINY,CLOUDY,如果根据天气计算心情的方法:guess(WeatcherEnumxx),就可以传入这三个值。返回值:天气猜测(参数),然后对方计算后,返回一个SNOWY,本地枚举中没有这个值,傻眼。不过另一位网友Brian的回答也很容易理解和列举,就是把已知的都列出来。作为二方/三方库的提供者,我支持什么你就用什么,这是安全的。库版本升级后,我支持更多。如果你不知道,你自然不会使用它。反正你不能把我不支持的参数传给我,所以作为输入,枚举简直就是一种安全保障。但是作为返回值,情况是相反的。我先告诉你,你可以有这些,然后你规定你可以有这些,其他的就没有了。但是,我负责,而不是你,所以你的规则不是废话。不仔细看手册的每一个字(假设有的话),鬼知道升级后的API会返回什么,抛出异常的可能性几乎是100%。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
