最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年05月13日 09:55:27   作者:Jeff、yuan  
這篇文章主要介紹了淺談Java中是否直接可以使用enum進(jìn)行傳輸,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

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

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

【強(qiáng)制】二方庫(kù)里可以定義枚舉類型,參數(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)核通過(guò)傳輸協(xié)議進(jìn)行打包傳)枚舉在進(jìn)行編譯后會(huì)生成一個(gè)相關(guān)的類,這個(gè)類,這個(gè)類繼承了JavaAPI中的java.lang.Enum類。那么我們看看這個(gè)類,毫無(wú)疑問(wèn)可以序列化。繼承了Serializable接口。那么就肯定就是可以序列化了。

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ì)象,通過(guò)本地序列化存入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\\票稅助手\\aresV3\\springCodestudy\\object.txt"));
  Person brady = (Person) ois.readObject();
  brady.getA();

  System.out.println(brady);
 }
}

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


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


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


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

借鑒知乎

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

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

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

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

相關(guān)文章

  • Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn)

    Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn)

    本文主要介紹了Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Spring你不知道的一種解耦模式

    Spring你不知道的一種解耦模式

    本文介紹一種方法,服務(wù)定位模式Service?Locator?Pattern來(lái)解決,它幫助我們消除緊耦合實(shí)現(xiàn)及其依賴性,并提出將服務(wù)與其具體類解耦
    2023-01-01
  • java8 多個(gè)list對(duì)象用lambda求差集操作

    java8 多個(gè)list對(duì)象用lambda求差集操作

    這篇文章主要介紹了java8 多個(gè)list對(duì)象用lambda求差集操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java接收xml格式參數(shù)轉(zhuǎn)為json的方法

    Java接收xml格式參數(shù)轉(zhuǎn)為json的方法

    文章主要介紹了如何使用JAXB將XML格式的參數(shù)接收并轉(zhuǎn)換為Java實(shí)體類,然后將實(shí)體類轉(zhuǎn)換為JSON格式,文中提到在實(shí)體類中使用`@XmlElement`和`@JsonProperty`注解的重要性,以及如何處理復(fù)雜的XML結(jié)構(gòu)
    2024-11-11
  • Spring Boot詳解整合JWT教程

    Spring Boot詳解整合JWT教程

    JWT是目前比較流行的跨域認(rèn)證解決方案,本文主要介紹了SpringBoot整合JWT的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法

    在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法

    這篇文章主要介紹了在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下
    2015-06-06
  • mybatis-plus內(nèi)置雪花算法主鍵重復(fù)問(wèn)題解決

    mybatis-plus內(nèi)置雪花算法主鍵重復(fù)問(wèn)題解決

    本文主要介紹了mybatis-plus內(nèi)置雪花算法主鍵重復(fù)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Flowable?ReceiveTask使用場(chǎng)景分析

    Flowable?ReceiveTask使用場(chǎng)景分析

    這篇文章主要為大家介紹了Flowable?ReceiveTask使用場(chǎng)景分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 一文詳解Spring Security的基本用法

    一文詳解Spring Security的基本用法

    Spring Security是一個(gè)功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問(wèn)控制框架, 提供了完善的認(rèn)證機(jī)制和方法級(jí)的授權(quán)功能。本文將通過(guò)一個(gè)簡(jiǎn)單的案例了解一下Spring Security的基本用法,需要的可以參考一下
    2022-05-05
  • java如何利用poi解析doc和docx中的數(shù)據(jù)

    java如何利用poi解析doc和docx中的數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于java如何利用poi解析doc和docx中數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論

民勤县| 沽源县| 五家渠市| 桐庐县| 方正县| 江陵县| 英德市| 耒阳市| 望奎县| 虹口区| 三门县| 牡丹江市| 广水市| 塔城市| 二连浩特市| 闸北区| 高邑县| 宜城市| 常宁市| 乐平市| 余江县| 乌兰察布市| 荔浦县| 通海县| 大英县| 沅江市| 九寨沟县| 张家界市| 舞阳县| 富锦市| 邹城市| 洪江市| 紫云| 莆田市| 来安县| 柯坪县| 绥德县| 赫章县| 蓬莱市| 高要市| 凌海市|