Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >枚举很好用啊,为啥阿里不建议返回值用枚举?

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

作者头像
Bug开发工程师
发布于 2020-02-11 06:44:27
发布于 2020-02-11 06:44:27
2.3K0
举报
文章被收录于专栏:码农沉思录码农沉思录

提问

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

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

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

看看作者孤尽是怎么说的

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

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

它的劣势也是明显的,就是不能扩展。可是为什么在返回值和参数进行了区分呢,如果不兼容,那么两个都有问题,怎么允许参数可以有枚举。当时的考虑,如果参数也不能用,那么枚举几乎无用武之地了。参数输出,毕竟是本地决定的,你本地有的,传送过去,向前兼容是不会有问题的。但如果是接口返回,就比较恶心了,因为解析回来的这个枚举值,可能本地还没有,这时就会抛出序列化异常。

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

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

枚举,就是把已知的全部罗列出来。作为二方/三方库的提供者,我支持什么,你们就是用什么,这样是安全的。库版本升级后我支持了更多,你不知道情况下自然不会使用,反正我不支持的参数你不可能传递给我,所以作为输入,枚举简直就是安全保障。但作为返回值,情况就反过来了。我先告诉你这些这些可以有,然后你规定这些这些可以有,除此之外都没有。但是,是我说了算而不是你,所以你的规定狗屁不是。没有仔细看手册(假设有的话)的每一个字,鬼知道升级后的api会返回什么,抛异常的可能性直趋百分百。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农沉思录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
枚举很好用啊,为啥阿里不建议返回值用枚举?
从手册可以看出,定义和使用枚举,阿里开发手册都是支持的,但是为啥,返回值就要反对了呢?
芋道源码
2019/12/24
2K0
枚举很好用啊,为啥阿里不建议返回值用枚举?
求你了,不要再在对外接口中使用枚举类型了!
最近,我们的线上环境出现了一个问题,线上代码在执行过程中抛出了一个IllegalArgumentException,分析堆栈后,发现最根本的的异常是以下内容:
Java识堂
2020/12/16
8650
求你了,不要再在对外接口中使用枚举类型了!
阿里巴巴Java开发手册(华山版)
前 言 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结, 经历了多次大规模一线实战的检验及不断完善, 公开到业界后,众多社区开发者踊跃参与,共同打磨完善, 系统化地整理成册。现代软件行业的高速发展对开发者的综合素质要求越来越高, 因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量。比如: 数据库的表结构和索引设计缺陷可能带来软件上的架构缺陷或性能风险; 工程结构混乱导致后续维护艰难;没有鉴权的漏洞代码易被黑客 攻击等等。所以本手册以 Java 开发者为中心视角,划分为编程规约、异常日志、 单元测试、 安全规约、 MySQL 数据库、 工程结构、 设计规约七个维度,再根据内容特征,细分成若干二级子目录。 另外,依据约束力强弱及故障敏感性,规约依次分为强制、推荐、参考三大类。 在延伸信息中,“说明” 对规约做了适当扩展和解释; “正例”提倡什么样的编码和实现方式; “反例”说明需要提防的雷区, 以及真实的错误案例。 手册的愿景是码出高效, 码出质量。 现代软件架构的复杂性需要协同开发完成, 如何高效地协同呢? 无规矩不成方圆,无规范难以协同, 比如, 制订交通法规表面上是要限制行车权, 实际上是保障公众的人身安全, 试想如果没有限速,没有红绿灯,谁还敢上路行驶? 对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的统一方式一起做事,提升协作效率, 降低沟通成本。 代码的字里行间流淌的是软件系统的血液, 质量的提升是尽可能少踩坑,杜绝踩重复的坑, 切实提升系统稳定性, 码出质量。 代码规约扫描引擎。 次年,发布 36 万字的配套详解图书《码出高效》 , 本书秉持“图胜于表,表胜于言” 的理念,深入浅出地将计算机基础、面向对象思想、 JVM 探源、数据结构与集合、并发与多线程、单元测试等知识客观、立体地呈现出来。紧扣学以致用、学以精进的目标,结合阿里巴巴实践经验和故障案例,与底层源码解析融会贯通,娓娓道来。 此书所得收入均捐赠公益事情,希望用技术情怀帮助更多的人。 一、 编程规约 (一) 命名风格
全栈程序员站长
2022/11/15
1.2K0
开发规约:接口统一返回值格式 [resend]
年过完,又开始搞钱了,没啥可以帮大家的。重要的事情说三次:有换工作的,如果接的自己还不错的,可以私聊内推。一、前言本篇主要介绍一种常用的返回值格式以及详细说明。二、Dubbo 接口统一返回值格式我们在应用中经常会涉及到 server 和 client 的交互,目前比较流行的是基于 json 格式的数据交互。但是 json 只是消息的格式,其中的内容还需要我们自行设计。不管是 HTTP 接口还是 RPC 接口保持返回值格式统一很重要,这将大大降低 client 的开发成本。2.1 定义返回值四要素
BUG弄潮儿
2022/03/08
6870
开发规约:接口统一返回值格式 [resend]
25. Groovy 孵化功能-记录类record和密封sealed的学习
本篇内容为Groovy学习笔记第二十五篇。主要内容为Groovy孵化功能(incubating)的学习。
zinyan.com
2023/02/23
9970
25. Groovy 孵化功能-记录类record和密封sealed的学习
阿里Java编程规约【九】 注释规约
1.【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用 /** 内容 */ 格式,不得使用 // xxx 方式。 说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Javadoc 可以正确输出相应注释;在 IDE 中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
acc8226
2022/05/17
1K0
优秀的开发者从命名开始
如何码出高质量的代码呢?其实命名也没有那么难,关键看你重不重视,愿不愿意花时间。以下是课程笔记和阿里巴巴的开发手册中觉得适用的部分,分享出来。
李明成
2020/04/01
4150
dubbo服务接口设计的几个建议
那如何解决呢?其实很简单。服务接口的参数类型最好是封装类,增加参数的话只是在这个类增加一个字段。示例如下:
用户7634691
2020/08/10
2K0
Java--Enum的思考
枚举类是Java5引进的特性,其目的是替换int枚举模式或者String枚举模式,使得语义更加清晰,另外也解决了行为和枚举绑定的问题.
屈定
2018/09/27
1K0
java | 深入理解Java枚举类型(二)
blog.csdn.net/javazejian/article/details/71333103
JavaFish
2019/10/17
1.3K0
Dubbo最佳实践,我整理了以下9点
Dubbo服务化,在当前互联网后端开发中,大部分都使用了Dubbo。截止目前github dubbo上,star也将近3万,使用dubbo的公司数量也很可观,Dubbo确实也是一个比较不错的服务化框架。
猿天地
2019/10/21
2.6K0
服务化最佳实践
建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
WindWant
2020/09/11
8060
三歪问我为啥用枚举,枚举有哪些用法?
在学习过程中,我们也只是在定义常量的时候,会意识到枚举的存在,而定义常量其实可以在类中实现,这时就会感觉枚举有点鸡肋。但在实际项目开发的过程中,枚举因相当迷人的特性而受到越来越多的关注。
敖丙
2020/05/26
1.1K0
android阿里面试java基础锦集
接着上一篇 android阿里面试锦集 今天给大家带来一篇 android阿里面试java基础锦集。很多知识都是Thinking in Java上面的,所以如果要深入大家可以看看这本书。 1.重载函数的签名(区别是否是重载函数) 方法名+参数类型+参数顺序(返回值不是) 2.finalize的工作原理 一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清
何时夕
2018/05/02
7460
万恶的NPE差点让我半个月工资没了
最近看到《阿里巴巴Java开发手册》(公众号回复[开发手册]免费获取)第11条规范写到:
java金融
2020/06/03
7320
万恶的NPE差点让我半个月工资没了
金秋十月,读阿里JAVA开发手册有感而发
最近重温阿里巴巴Java开发手册这本书,思考了什么样的代码是好代码,给大家分享一下我的想法,有哪里不对,欢迎指出,感激不尽。
捡田螺的小男孩
2020/04/15
4470
金秋十月,读阿里JAVA开发手册有感而发
为什么建议你使用枚举?
枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错误码等。
磊哥
2020/06/29
4050
为什么建议你使用枚举?
整理《阿里巴巴Java开发手册》常用的编码规约
1、抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。 2、中括号是数组类型的一部分,数组定义如下:String[] args; 3、POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。 4、包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。 5、如果使用到了设计模式,建议在类名中体现出具体模式。 6、接口类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。 7、对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。 8、枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。 9、各层命名规约:    A) Service/DAO层方法命名规约      1) 获取单个对象的方法用get做前缀。      2) 获取多个对象的方法用list做前缀。      3) 获取统计值的方法用count做前缀。      4) 插入的方法用save(推荐)或insert做前缀。      5) 删除的方法用remove(推荐)或delete做前缀。      6) 修改的方法用update做前缀。    B) 领域模型命名规约      1) 数据对象:xxxDO,xxx即为数据表名。      2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。      3) 展示对象:xxxVO,xxx一般为网页名称。      4) POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。
程序员云帆哥
2022/05/12
7900
整理《阿里巴巴Java开发手册》常用的编码规约
阿里编程规范 pdf_阿里前端开发规范
统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本
全栈程序员站长
2022/11/17
1.3K0
阿里编程规范 pdf_阿里前端开发规范
【Java数据结构】反射、枚举以及lambda表达式
Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。其本质是JVM得到Class对象之后,再通过Class对象进行反编译,从而获取对象的各种信息。
E绵绵
2024/09/12
1120
【Java数据结构】反射、枚举以及lambda表达式
相关推荐
枚举很好用啊,为啥阿里不建议返回值用枚举?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档