亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java如何定義Union類實現數據體的共存

發布時間:2022-03-11 11:46:17 來源:億速云 閱讀:1715 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關java如何定義Union類實現數據體的共存的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

定義Union類實現數據體的共存

在C/C++語言中,聯合體(union),又稱共用體,類似結構體(struct)的一種數據結構。聯合體(union)和結構體(struct)一樣,可以包含很多種數據類型和變量,兩者區別如下:

  1. 結構體(struct)中所有變量是“共存”的,同時所有變量都生效,各個變量占據不同的內存空間;

  2. 聯合體(union)中是各變量是“互斥”的,同時只有一個變量生效,所有變量占據同一塊內存空間。

當多個數據需要共享內存或者多個數據每次只取其一時,可以采用聯合體(union)。

在Java語言中,沒有聯合體(union)和結構體(struct)概念,只有類(class)的概念。眾所眾知,結構體(struct)可以用類(class)來實現。其實,聯合體(union)也可以用類(class)來實現。但是,這個類不具備“多個數據需要共享內存”的功能,只具備“多個數據每次只取其一”的功能。

這里,以微信協議的客戶消息為例說明。根據我多年來的接口協議封裝經驗,主要有以下兩種實現方式。

1.使用函數方式實現Union

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);

  • 缺點:實現邏輯較為復雜,參數類型驗證較多。

2.使用繼承方式實現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類實現數據體的共存”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

天水市| 门源| 杭锦旗| 巧家县| 张北县| 兴化市| 二连浩特市| 虹口区| 呼和浩特市| 利津县| 如皋市| 三门县| 焉耆| 临洮县| 株洲市| 莆田市| 政和县| 中卫市| 黄梅县| 湾仔区| 华安县| 张家界市| 石柱| 栾川县| 华容县| 海南省| 新疆| 安阳县| 鲁山县| 永康市| 万载县| 泉州市| 诸暨市| 太保市| 彭州市| 山东省| 阿鲁科尔沁旗| 荆州市| 扎兰屯市| 玉屏| 望江县|