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