色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

淺談Java中是否直接可以使用enum進(jìn)行傳輸

瀏覽:76日期:2022-09-01 17:35:50

背景

我們?cè)谶M(jìn)行傳輸?shù)臅r(shí)候 會(huì)有一些狀態(tài)值,如Status為1代表刪除,為0代表失敗或者怎么樣的。只傳輸一個(gè))0或者1過去給第三方(此處不包括給前端),如果沒有契約第三方會(huì)不認(rèn)識(shí)你這個(gè)是什么意思,那我們?cè)谄綍r(shí)寫業(yè)務(wù)邏輯的時(shí)候使用枚舉很輕易就知道了什么狀態(tài)什么值。所以我們?cè)跇?gòu)建DTO對(duì)象的時(shí)候里面放一個(gè)枚舉來表示。

首先在阿里的規(guī)范里是這樣說的:

【強(qiáng)制】二方庫里可以定義枚舉類型,參數(shù)可以使用枚舉類型,但是接口返回值不允許使用枚舉類型或者包含枚舉類型的 POJO 對(duì)象。那到底為啥不能用呢?

枚舉

首先我們得先思考一下枚舉是否可以進(jìn)行序列化,我們?cè)诎褜?duì)象進(jìn)行傳輸?shù)臅r(shí)候需要將這個(gè)對(duì)象序列化為字節(jié)序列進(jìn)行傳輸(在linux中一切皆文件,JVM虛擬機(jī)將對(duì)象變?yōu)樽止?jié)給到內(nèi)核通過傳輸協(xié)議進(jìn)行打包傳)枚舉在進(jìn)行編譯后會(huì)生成一個(gè)相關(guān)的類,這個(gè)類,這個(gè)類繼承了JavaAPI中的java.lang.Enum類。那么我們看看這個(gè)類,毫無疑問可以序列化。繼承了Serializable接口。那么就肯定就是可以序列化了。

淺談Java中是否直接可以使用enum進(jìn)行傳輸

Enum實(shí)戰(zhàn)序列化

1. 創(chuàng)建一個(gè)枚舉類

package SerializableEnum;/** * @Author:yuanxindong * @Date:2020/5/101:33 */public enum PersonEnum { /** * 小圓 */ YUANXINDONG('yuanxindong',1); ; private String age; private int i; PersonEnum(String yuanxindong, int i) { this.age = yuanxindong; this.i = i; }}

2.將枚舉類放入Person對(duì)象,通過本地序列化存入target文件夾中,再進(jìn)行反序列化,讀取查看枚舉的值

package SerializableEnum;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;/** * @Author:yuanxindong * @Date:2020/5/101:31 */public class Person implements Serializable { private String name; PersonEnum a; public void setName(String name) { this.name = name; } public void setA(PersonEnum a) { this.a = a; } public String getName() { return name; } public PersonEnum getA() { return a; } @Override public String toString() { return 'Person{' + 'name=’' + name + ’’’ + ', a=' + a + ’}’; } public static void main(String[] args) throws IOException, ClassNotFoundException { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream('object.txt')); Person p = new Person(); p.setA(PersonEnum.YUANXINDONG); p.setName('小圓'); oos.writeObject(p); ObjectInputStream ois = new ObjectInputStream(new FileInputStream('D:workCode票稅助手aresV3springCodestudyobject.txt')); Person brady = (Person) ois.readObject(); brady.getA(); System.out.println(brady); }}

執(zhí)行結(jié)果:

淺談Java中是否直接可以使用enum進(jìn)行傳輸

但是在控制臺(tái)輸出的對(duì)象是枚舉的命名,沒有枚舉中的值,這時(shí)為什么呢?

淺談Java中是否直接可以使用enum進(jìn)行傳輸

==我用的是aliFastJson轉(zhuǎn)還為JsonObject的我們看看他里面的實(shí)現(xiàn)。只是拿了對(duì)應(yīng)枚舉的name(感覺是個(gè)坑?。?,這也阿里規(guī)范中不能使用枚舉放在DTO的原因之一吧==

淺談Java中是否直接可以使用enum進(jìn)行傳輸

上面的內(nèi)容整明了枚舉是可以進(jìn)行序列化的,是可以被傳輸?shù)?,他的?shí)現(xiàn)也是通過類來實(shí)現(xiàn)的,除了fastJSON那一步,使用都沒有問題的。其他角度考慮

借鑒知乎

使用枚舉的確會(huì)帶來擴(kuò)展兼容性的問題,這點(diǎn)很多答主都說的很好了,我就說一下為什么參數(shù)上可以使用枚舉的原因吧。咱們先假定對(duì)枚舉的擴(kuò)展只是新增值,而不是減少值。比如說性別中本來是男和女,現(xiàn)在要增加一個(gè)transgender, 但我們極少極少會(huì)有需求說,把性別中的已有男或者女去掉。(我覺得這個(gè)假設(shè)是參數(shù)可以使用枚舉型的前提)在這個(gè)假定下如果我們?cè)诮涌谥惺褂妹杜e型,如孤盡兄在java開發(fā)手冊(cè)中所述,分為參數(shù)和返回值兩種情況。不管是微服務(wù)之間的互相調(diào)用,還是手機(jī)客戶端到服務(wù)器的調(diào)用,在不停機(jī)的情況下,服務(wù)器端和客戶端是很難一起更新的,往往我們是服務(wù)器端先來支持新feature,然后再來逐步更新客戶端。我想孤盡兄說參數(shù)可以使用枚舉型,也是基于這種更新升級(jí)方式。因?yàn)榉?wù)器端如果突然開始返回transgender這個(gè)新性別,客戶端吃不進(jìn)去(反序列化不了),客戶端就炸了。但如果服務(wù)器端只是在參數(shù)上開始接受新性別,那就不怕老客戶端,反正老客戶端還在那里繼續(xù)發(fā)送男和女這兩種性別,服務(wù)器端都認(rèn)識(shí),就不會(huì)出錯(cuò)。兩邊可以一直相安無事,慢慢等所有客戶端都升級(jí)。但是呢,如果我們用string來代替枚舉,服務(wù)器端貿(mào)然返回一個(gè)新的值,客戶端不知道怎么處理,也可能會(huì)產(chǎn)生其他問題,比如說錢算錯(cuò)了之類業(yè)務(wù)層面的問題。所以客戶端代碼可能要先更新一點(diǎn),讓其能處理這個(gè)新的值。我覺得阿里把這個(gè)標(biāo)準(zhǔn)放在手冊(cè)里,也是多年的經(jīng)驗(yàn)教訓(xùn),兩害相權(quán)取其輕吧。因?yàn)楹芏鄳?yīng)用是沒法強(qiáng)制客戶端一起更新的。尤其是手機(jī)移動(dòng)客戶端,ios可能還要審核,很難做到客戶端和服務(wù)器端同步更新。如果是微服務(wù),也很難在不停機(jī)的情況下,把通過枚舉耦合兩個(gè)微服務(wù)一起更新。

看完大佬的說法個(gè)人感覺:

是的你在一個(gè)項(xiàng)目中維護(hù)是沒有什么問題。但是多個(gè)項(xiàng)目使用同一個(gè)枚舉怎么搞。要么這個(gè)枚舉一處動(dòng)即全動(dòng)。所有的項(xiàng)目使用這一個(gè)枚舉。比如說全公司有一個(gè)通用的發(fā)票類型枚舉,有幾個(gè)狀態(tài)值代表一鐘發(fā)票類型,于是這個(gè)枚舉維護(hù)到公共配置上,通過動(dòng)態(tài)加載技術(shù),在每次發(fā)布或者有修改的時(shí)候進(jìn)行動(dòng)態(tài)加載。感覺同完美。小白的YY。落地難嗎??試一試。后面更新。

到此這篇關(guān)于淺談Java中是否直接可以使用enum進(jìn)行傳輸?shù)奈恼戮徒榻B到這了,更多相關(guān)Java enum 傳輸內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产区精品一区二区不卡中文 | 精品自拍视频 | 日韩精品一区二区三区视频 | 免费观看a级毛片在线播放 免费观看a级网站 | 91九色视频无限观看免费 | 91精品国产免费久久久久久青草 | 亚洲日本aⅴ片在线观看香蕉 | 久久精品免费观看国产软件 | 一级看片免费视频 | 亚洲一级毛片中文字幕 | 亚洲男人的天堂网 | 看国产一级毛片 | 久精品在线观看 | 国产欧美日韩精品第一区 | 欧美一区二区三区精品 | 扒开双腿猛进入喷水免费视频 | 国产伦精品一区二区三区 | 精品视自拍视频在线观看 | 九九九九九九 | 草草日| 99久久久久国产精品免费 | 国产福利微拍精品一区二区 | 久久91精品国产91久久跳舞 | 日韩成人在线观看视频 | 全部免费的毛片在线看美国 | 成人午夜性a一级毛片美女 成人午夜亚洲影视在线观看 | 快色网站 | 成人交性视频免费看 | 久久国产精品视频一区 | 欧美成人欧美激情欧美风情 | 久草在线新首页 | 国产成人免费高清激情视频 | 欧美一级大尺度毛片 | 久草在线免费福利视频 | 国产一级做a爱免费观看 | 欧美成亚洲 | 永久免费不卡在线观看黄网站 | 国产95在线 | 亚洲 | 免费一级大片 | 91成人国产 | 欧美在线综合视频 |