xp sp2 序列号-system volume

阿里巴巴java开发手册
2023年4月3日发(作者:qq监视器)

为什么阿⾥巴巴Java开发⼿册中强制要求接⼝返回值不允许使

⽤枚举?

在阅读《阿⾥巴巴Java开发⼿册》时,发现有⼀条关于⼆⽅库依赖中接⼝返回值不允许使⽤枚举类型的规约,具体内容如下:

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

包)。

那么⼀⽅库便是本⼯程内部⼦项⽬模块依赖的库;三⽅库为公司之外的开源库,⽐如像fastjson、easyexcel这种。

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

⽐如星巴克提供了0.0.1版本的⼆⽅库,定义了⼀个Starbucks类,⾥⾯包含了枚举类型的SizeEnum,⾥⾯分别是中杯、⼤杯、特⼤杯。

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

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

有⼀天,⽼罗说要那个中等⼤⼩的中杯拿铁,但是服务员说那是⼤杯,经过⼀番争论,罗⽼师很是⽣⽓。

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

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

由于星巴克的门店⽐较多,有的还不知道这个新加的需求,因此返回结果中出现了SHORT,但是0.0.1版本的⼆⽅库中没有⼩杯啊,所以就

publicclassStarbucksimplementsSerializable{

privateLongid;

privateStringname;

privateIntegercapacity;

privateSizeEnumsizeEum;

}

publicenumSizeEnum{

TALL(1),

GRANDE(2),

VENTI(3)

}

publicclassStarbucksImplimplementsStarbucksService{

publicStarbucksgetStarbucksById(Longid){

Starbucksstarbucks=newStarbucks();

(1L);

e("Latte");

acity(360);

eEnum();

returnstarbucks;

}

}

publicclassStarbucksDemo{

@Resource

privateStarbucksServicestarbucksService;

publicvoidgetStarbucks(){

Starbucksstarbucks=rbucksById(1L);

n(starbucks);

}

}

publicenumSizeEnum{

TALL(1),

GRANDE(2),

VENTI(3),

SHORT(4)

}

publicclassStarbucksImplimplementsStarbucksService{

publicStarbucksgetStarbucksById(Longid){

Starbucksstarbucks=newStarbucks();

(1L);

e("Latte");

acity(240);

eEnum();

returnstarbucks;

}

}

出问题了,也就是序列化失败。

通过这个例⼦,我相信⼤家对枚举类型作为返回结果有了⼀定的理解,下⾯引⽤孤尽⼤佬在知乎的回答:

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

Java中出现的任何元素,在Gosling的⾓度都会有背后的思考和逻辑(尽管并⾮绝对完美,但Java的顶层抽象已经是天才级

了),⽐如:接⼝、抽象类、注解、和本⽂提到的枚举。枚举有好处,类型安全,清晰直接,还可以使⽤等号来判断,也可以⽤

在switch中。它的劣势也是明显的,就是不要扩展。可是为什么在返回值和参数进⾏了区分呢,如果不兼容,那么两个都有问

题,怎么允许参数可以有枚举。当时的考虑,如果参数也不能⽤,那么枚举⼏乎⽆⽤武之地了。参数输出,毕竟是本地决定的,

你本地有的,传送过去,向前兼容是不会有问题的。但如果是接⼝返回,就⽐较恶⼼了,因为解析回来的这个枚举值,可能本地

还没有,这时就会抛出序列化异常。

⽐如:你的本地枚举类,有⼀个天⽓Enum:SUNNY,RAINY,CLOUDY,如果根据天⽓计算⼼情的⽅法:

guess(WeatcherEnumxx),传⼊这三个值都是可以的。返回值:Weatherguess(参数),那么对⽅运算后,返回⼀个SNOWY,

本地枚举⾥没有这个值,傻眼了。

总结

本⽂通过⼀个实例让⼤家理解到枚举类型作为返回结果的坑,⼤家可以使⽤基本类型或者基本类型包装类来替换掉枚举类型就可以避免掉这

么问题了。

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

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

参考

《Java开发⼿册》泰⼭版

更多推荐

阿里巴巴java开发手册