您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)java如何定義Union類實現(xiàn)數(shù)據(jù)體的共存的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在C/C++語言中,聯(lián)合體(union),又稱共用體,類似結(jié)構(gòu)體(struct)的一種數(shù)據(jù)結(jié)構(gòu)。聯(lián)合體(union)和結(jié)構(gòu)體(struct)一樣,可以包含很多種數(shù)據(jù)類型和變量,兩者區(qū)別如下:
結(jié)構(gòu)體(struct)中所有變量是“共存”的,同時所有變量都生效,各個變量占據(jù)不同的內(nèi)存空間;
聯(lián)合體(union)中是各變量是“互斥”的,同時只有一個變量生效,所有變量占據(jù)同一塊內(nèi)存空間。
當多個數(shù)據(jù)需要共享內(nèi)存或者多個數(shù)據(jù)每次只取其一時,可以采用聯(lián)合體(union)。
在Java語言中,沒有聯(lián)合體(union)和結(jié)構(gòu)體(struct)概念,只有類(class)的概念。眾所眾知,結(jié)構(gòu)體(struct)可以用類(class)來實現(xiàn)。其實,聯(lián)合體(union)也可以用類(class)來實現(xiàn)。但是,這個類不具備“多個數(shù)據(jù)需要共享內(nèi)存”的功能,只具備“多個數(shù)據(jù)每次只取其一”的功能。
這里,以微信協(xié)議的客戶消息為例說明。根據(jù)我多年來的接口協(xié)議封裝經(jīng)驗,主要有以下兩種實現(xiàn)方式。
Union類實現(xiàn):
/** 客戶消息類 */@ToStringpublic class CustomerMessage { /** 屬性相關(guān) */ /** 消息類型 */ private String msgType; /** 目標用戶 */ private String toUser; /** 共用體相關(guān) */ /** 新聞內(nèi)容 */ private News news; ... /** 常量相關(guān) */ /** 新聞消息 */ public static final String MSG_TYPE_NEWS = "news"; ... /** 構(gòu)造函數(shù) */ public CustomerMessage() {} /** 構(gòu)造函數(shù) */ public CustomerMessage(String toUser) { this.toUser = toUser; } /** 構(gòu)造函數(shù) */ public CustomerMessage(String toUser, News news) { this.toUser = toUser; this.msgType = MSG_TYPE_NEWS; this.news = news; } /** 清除消息內(nèi)容 */ private void removeMsgContent() { // 檢查消息類型 if (Objects.isNull(msgType)) { return; } // 清除消息內(nèi)容 if (MSG_TYPE_NEWS.equals(msgType)) { news = null; } else if (...) { ... } msgType = null; } /** 檢查消息類型 */ private void checkMsgType(String msgType) { // 檢查消息類型 if (Objects.isNull(msgType)) { throw new IllegalArgumentException("消息類型為空"); } // 比較消息類型 if (!Objects.equals(msgType, this.msgType)) { throw new IllegalArgumentException("消息類型不匹配"); } } /** 設置消息類型函數(shù) */ public void setMsgType(String msgType) { // 清除消息內(nèi)容 removeMsgContent(); // 檢查消息類型 if (Objects.isNull(msgType)) { throw new IllegalArgumentException("消息類型為空"); } // 賦值消息內(nèi)容 this.msgType = msgType; if (MSG_TYPE_NEWS.equals(msgType)) { news = new News(); } else if (...) { ... } else { throw new IllegalArgumentException("消息類型不支持"); } } /** 獲取消息類型 */ public String getMsgType() { // 檢查消息類型 if (Objects.isNull(msgType)) { throw new IllegalArgumentException("消息類型無效"); } // 返回消息類型 return this.msgType; } /** 設置新聞 */ public void setNews(News news) { // 清除消息內(nèi)容 removeMsgContent(); // 賦值消息內(nèi)容 this.msgType = MSG_TYPE_NEWS; this.news = news; } /** 獲取新聞 */ public News getNews() { // 檢查消息類型 checkMsgType(MSG_TYPE_NEWS); // 返回消息內(nèi)容 return this.news; } ... }
Union類使用:
String accessToken = ...; String toUser = ...; List<Article> articleList = ...; News news = new News(articleList); CustomerMessage customerMessage = new CustomerMessage(toUser, news); wechatApi.sendCustomerMessage(accessToken, customerMessage);
主要優(yōu)缺點:
優(yōu)點:更貼近C/C++語言的聯(lián)合體(union);
缺點:實現(xiàn)邏輯較為復雜,參數(shù)類型驗證較多。
Union類實現(xiàn):
/** 客戶消息類 */@Getter@Setter@ToStringpublic abstract class CustomerMessage { /** 屬性相關(guān) */ /** 消息類型 */ private String msgType; /** 目標用戶 */ private String toUser; /** 常量相關(guān) */ /** 新聞消息 */ public static final String MSG_TYPE_NEWS = "news"; ... /** 構(gòu)造函數(shù) */ public CustomerMessage(String msgType) { this.msgType = msgType; } /** 構(gòu)造函數(shù) */ public CustomerMessage(String msgType, String toUser) { this.msgType = msgType; this.toUser = toUser; } }/** 新聞客戶消息類 */@Getter@Setter@ToString(callSuper = true)public class NewsCustomerMessage extends CustomerMessage { /** 屬性相關(guān) */ /** 新聞內(nèi)容 */ private News news; /** 構(gòu)造函數(shù) */ public NewsCustomerMessage() { super(MSG_TYPE_NEWS); } /** 構(gòu)造函數(shù) */ public NewsCustomerMessage(String toUser, News news) { super(MSG_TYPE_NEWS, toUser); this.news = news; } }
Union類使用:
String accessToken = ...; String toUser = ...; List<Article> articleList = ...; News news = new News(articleList); CustomerMessage customerMessage = new NewsCustomerMessage(toUser, news); wechatApi.sendCustomerMessage(accessToken, customerMessage);
主要優(yōu)缺點:
優(yōu)點:使用虛基類和子類進行拆分,各個子類對象的概念明確;
缺點:與C/C++語言的聯(lián)合體(union)差別大,但是功能上大體一致。
在C/C++語言中,聯(lián)合體并不包括聯(lián)合體當前的數(shù)據(jù)類型。但在上面實現(xiàn)的Java聯(lián)合體中,已經(jīng)包含了聯(lián)合體對應的數(shù)據(jù)類型。所以,從嚴格意義上說,Java聯(lián)合體并不是真正的聯(lián)合體,只是一個具備“多個數(shù)據(jù)每次只取其一”功能的類。
感謝各位的閱讀!關(guān)于“java如何定義Union類實現(xiàn)數(shù)據(jù)體的共存”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。