电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

淺談Java中是否直接可以使用enum進行傳輸

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

背景

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

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

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

枚舉

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

淺談Java中是否直接可以使用enum進行傳輸

Enum實戰(zhàn)序列化

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

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對象,通過本地序列化存入target文件夾中,再進行反序列化,讀取查看枚舉的值

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進行傳輸

但是在控制臺輸出的對象是枚舉的命名,沒有枚舉中的值,這時為什么呢?

淺談Java中是否直接可以使用enum進行傳輸

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

淺談Java中是否直接可以使用enum進行傳輸

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

借鑒知乎

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

看完大佬的說法個人感覺:

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

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

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 针焰试验仪,灼热丝试验仪,漏电起痕试验仪,水平垂直燃烧试验仪 - 苏州亚诺天下仪器有限公司 | 开云(中国)Kaiyun·官方网站-登录入口 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | B2B网站_B2B免费发布信息网站_B2B企业贸易平台 - 企资网 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 土壤有机碳消解器-石油|表层油类分析采水器-青岛溯源环保设备有限公司 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 特种电缆厂家-硅橡胶耐高温电缆-耐低温补偿导线-安徽万邦特种电缆有限公司 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 口臭的治疗方法,口臭怎么办,怎么除口臭,口臭的原因-口臭治疗网 | 小型气象站_便携式自动气象站_校园气象站-竞道气象设备网 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 北京发电机出租_发电机租赁_北京发电机维修 - 河北腾伦发电机出租 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 成都珞石机械 - 模温机、油温机、油加热器生产厂家 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 玄米影院| 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 微动开关厂家-东莞市德沃电子科技有限公司 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 台湾Apex减速机_APEX行星减速机_台湾精锐减速机厂家代理【现货】-杭州摩森机电 | 酒万铺-酒水招商-酒水代理| 无机纤维喷涂棉-喷涂棉施工工程-山东华泉建筑工程有限公司▲ | 济南铝方通-济南铝方通价格-济南方通厂家-山东鲁方通建材有限公司 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 |