溫馨提示×

溫馨提示×

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

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

java如何定義Union類實現(xiàn)數(shù)據(jù)體的共存

發(fā)布時間:2022-03-11 11:46:17 來源:億速云 閱讀:1709 作者:小新 欄目:開發(fā)技術(shù)

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

定義Union類實現(xiàn)數(shù)據(jù)體的共存

在C/C++語言中,聯(lián)合體(union),又稱共用體,類似結(jié)構(gòu)體(struct)的一種數(shù)據(jù)結(jié)構(gòu)。聯(lián)合體(union)和結(jié)構(gòu)體(struct)一樣,可以包含很多種數(shù)據(jù)類型和變量,兩者區(qū)別如下:

  1. 結(jié)構(gòu)體(struct)中所有變量是“共存”的,同時所有變量都生效,各個變量占據(jù)不同的內(nèi)存空間;

  2. 聯(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)方式。

1.使用函數(shù)方式實現(xiàn)Union

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ù)類型驗證較多。

2.使用繼承方式實現(xiàn)Union

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)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI