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

阿里巴巴Java开发手册编程规约 Java 编码规范 阅读详情

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,可以关注并私信我:01。获取。我这里有最新的Java基础全套视频教程。

Cocos Creator 3.x 实战:用脚本动态加载Spine动画,告别resources硬编码 本文详细介绍了Cocos Creator 3.x中Spine动画的动态加载与挂点系统实战技巧。通过Asset Bundle替代传统resources硬编码方式,实现资源的高效管理和热更新支持,同时结合TypeScript强类型和单例模式优化加载流程。文章还深入探讨了跨平台适配、挂点编程方案及性能优化策略,帮助开发者提升游戏开发效率与灵活性。 阅读详情

相关推荐

springcloud+nacos+gateway+oauth2小聚会

在微服务工程中,Nacos作为目前主流的注册中心和配置中心,Spring Cloud Gateway作为目前主流的网关,下面引入spring security+oauth2+jwt作为认证和授权中心,进行简单的聊聊。

ldcaws的专栏 2646

java禁用_java 功能启用与禁用

js 部分/*** 更新状态*/function update(nid, sta, th,type){if(type==1){if(window.confirm("是否删除?")){}else{return "";}}$.ajax({url:"/yq1012/xxx.do",//后台urldata:{newsId:nid,status:sta},async:false,success:functi...

weixin_35675138的博客 2068

多智能体协作的本质是中介者模式,不是多开Agent

多智能体系统并非简单启动多个Agent实例,而是一种受控的、可验证的动态交互过程。其核心原理在于解耦Agent间直接依赖,通过中央中介者统一管理任务分发、协议转换、状态协调与故障兜底。这种架构显著提升系统的可观测性、容错性与可维护性,技术价值体现在强一致性保障(如金融订单原子操作)与灵活自治平衡(如边缘设备轻量协同)。典型应用场景包括电商客服协同、工业巡检调度、飞书/微信多渠道智能服务等。OpenClaw与Hermes Agent正是这一范式的工程落地代表,分别体现强中介与弱中介两种演进路径。

weixin_34151004的博客 359

java枚举

public enum Type {     STATUS_0(0,"禁用"),STATUS_1(1,"启动");     private Integer code;     private String desc;          private Type(Integer code, String desc) {         this.code = code;        

看图说话 346

HomeAssistant+HACS实战:5分钟搞定米家设备接入(附HomeKit配置技巧)

本文详细介绍了如何通过HomeAssistant和HACS插件商店快速接入米家设备,并分享HomeKit配置技巧。从HACS安装到米家设备接入,再到HomeKit设备集成,提供一站式智能家居解决方案,帮助用户实现设备统一管理和自动化场景设置。

weixin_29192141的博客 1049

RTX 50系显卡(5080/5090D)CUDA 12.8环境下的vLLM部署避坑与实战指南

本文为RTX 5080/5090D显卡用户提供了在CUDA 12.8环境下部署vLLM的完整实战指南。文章详细介绍了从驱动安装、CUDA 12.8环境配置、PyTorch Nightly版本精准匹配,到vLLM源码编译及常见报错排查的全过程,帮助开发者高效利用新一代硬件进行大模型推理。

gray5的博客 667

Java基础——枚举类的使用教程

Java基础——枚举类的使用教程知识点笔记

青春无问西东 岁月自成芳华 2083

TMS-EEG数据预处理:eeglab工具包TESA(一)

b. 自动选择:Tools -> Reject data epochs -> Reject by probability,然后进行Plot -> channel,进行删除。TMS-EEG(经颅磁刺激-脑电图)是一种结合了TMS和EEG记录的技术,这种技术允许研究者在非侵入的情况下探测大脑环路,评估大脑的兴奋性和连通性等皮层特性。对移除脉冲伪迹的数据进行插值:Tools ->TESA -> Interpolate removed data;插值后,画图查看:数据会有数值;

weixin_43604817的博客 1494

JAVA轻量级错误码设计最佳实践

目前公司团队项目中返回异常都没有错误码,如果遇到错误提示只会返回一个错误信息。随着微服务组件越来越多,这样给不同团队之间沟通交流、排查错误带来了极大的困难。于是在网上搜索了一番以后,决心要重新设计下错误码机制.本文主要讲解了错误码设计的方案,希望对大家有帮助,如果有更好的方案设计,也可以留言,一起成长提高。

java_lujj的博客 1333

PCL 读取和保存点云

PCL (Point Cloud Library) 是一个用于处理 3D 点云数据的开源库。在处理点云数据时,常见的任务包括点云的读写和可视化。PCL 提供了强大的 IO 模块来读取和写入各种格式的点云文件,并且提供了可视化模块来对点云进行渲染和显示。点云的读写与显示是很多 3D 数据处理任务的基础步骤,通过这些步骤,可以对点云进行预处理、分析和操作。

纵马踏花向自由 1739

关于阿里java开发规范中枚举类型字段必须有注释的思考

在阿里巴巴java开发规范中,有下面这条规范 【强制】所有的枚举类型字段必须要有注释,说明每个数据项的用途。 这条规范很好理解,一个枚举常量,如果没有注释的话,其含义只能通过命名去揣测,并不靠谱。 但是吧,当初我写代码的时候为什么没加注释呢? 原因也很简单,在我的系统设计中,将所有的异常,使用了枚举类,扩展了一个message属性,用于系统抛出异常后,给系统用户一个友好的提示,也就是对应的中文描述信息。...

学海无涯,行者无疆 4566

【华为OD机试真题】45、 分糖果 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

### 🎃题目描述 >小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 >  当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 >  小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1290

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

在阅读《阿里巴巴Java开发手册》时,发现有一条关于二方库依赖中接口返回值不允许使用枚举类型的规约,具体内容如下:在谈论为什么之前先来科普下什么是二方库,二方库也称作二方包,一般指公司内...

武培轩 1625

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

在阅读《阿里巴巴Java开发手册》时,发现有一条关于二方库依赖中接口返回值不允许使用枚举类型的规约,具体内容如下:在谈论为什么之前先来科普下什么是二方库,二方库也称作二方包,一般指公司内部发布到中央仓库,可供公司内部其他应用依赖的库(jar 包)。那么一方库便是本工程内部子项目模块依赖的库;三方库为公司之外的开源库,比如像 fastjson、easyexcel 这种。下面我们就通过一个例子来看下为...

weixin_39716971的博客 115

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

阿里巴巴JAVA开发手册 Java 开发手册

SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id。而不是 new Date().getTime();catch,使用 catch(Exception e)方式,并 throw new DaoException(e),不需要打印日志,1. 【强制】不要使用 count(列名)或 count(常量)来替代 count(*),count(*)就是 SQL92 定义的。

2302_78411932的博客 3230

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?

在阅读《阿里巴巴Java开发手册》时,发现有一条关于关于常量定义的规约,具体内容如下:图中的反例是将数据缓存起来,并使用魔法值加链路 id 组成 key,这就可能会出现其他开发人员在复制...

武培轩 1587

为什么阿里不建议在返回对象中使用枚举

1 文章概述 在阿里巴巴开发手册中有这样一条强制规定值得大家关注:【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚举类型或者包含枚举类型的POJO对象。 我们在日常开发中服务生产者会提供二方包给消费者引用,在返回对象中属性不能包含枚举类型,这是一个强制要求。我们通过一个实例分析:为什么阿里巴巴开发手册中会有这样一条强制要求。 2 生产者实例 服务生产者提供1.0版本二方包 public class StudentDTO implements Seriali.

JAVA前线技术专栏 883

不允许使用不完整的类型_为什么阿里强制要求接口返回值不允许使用枚举?

在谈论为什么之前先来科普下什么是二方库,二方库也称作二方包,一般指公司内部发布到中央仓库,可供公司内部其他应用依赖的库(jar 包)。那么一方库便是本工程内部子项目模块依赖的库;三方库为公司之外的开源库,比如像 fastjson、easyexcel 这种。下面我们就通过一个例子来看下为什么阿里巴巴不允许返回枚举类型或者包含枚举类型的 POJO 对象。比如星巴克提供了 0.0.1 版本的二...

weixin_39690391的博客 233

阿里巴巴java开发手册

阿里巴巴java开发手册

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 3978

面试官:为什么《阿里巴巴Java开发手册》上要禁止使用Executors来创建线程池

面试官:为什么《阿里巴巴Java开发手册》上要禁止使用Executors来创建线程池

天堂的博客 3078

java 不要使用魔法值_为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?...

武培轩推荐搜索JavaSpring Boot数据结构MySQLElasticsearchNginx在阅读《阿里巴巴Java开发手册》时,发现有一条关于关于常量定义的规约,具体内容如下:图中的反例是将数据缓存起来,并使用魔法值加链路 id 组成 key,这就可能会出现其他开发人员在复制粘贴的时候,少复制 _ 的情况发生,这种错误很难去检查到,因为读取缓存不存在,可能会去数据库读取,很难察觉到。如果在...

weixin_34726945的博客 724

阿里巴巴java开发手册 ,java开发规范

阿里巴巴java开发手册 ,java开发规范

g470641382的博客 1616

阿里巴巴java 开发手册1.7

《Java 开发手册》是 Java 社区爱好者的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,整理成册后,众多社区开发者踊跃参与打磨完善,系统化地整理成册,当前的最新版本是黄山版。现代软件行业的高速发展对开发者的综合素质要求越来越高,因为不仅是编程知识点,其它维度的知识点也会影响到软件的最终交付质量。

程序员一博 3452

阿里 java 变量命名规范_阿里巴巴Java开发手册-命名规约

1. 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反例: _name / __name / $Object / name_ / name$ / Object$2. 【强制】 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。反例: DaZheP...

weixin_42495394的博客 2007
上一篇: 金三银四即将到来,大厂招聘,这些Java高频面试点你都知道吗?
下一篇: 自学Java如何找工作?
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值