Dalam bahasa C/C++, kesatuan, juga dikenali sebagai kesatuan, ialah struktur data yang serupa dengan struct. Kesatuan, seperti struct, boleh mengandungi banyak jenis data dan pembolehubah Perbezaan antara kedua-duanya adalah seperti berikut:
Semua pembolehubah dalam struct "wujud bersama" ", semua pembolehubah adalah berkesan. pada masa yang sama, dan setiap pembolehubah menduduki ruang memori yang berbeza; semua pembolehubah menduduki ruang memori yang sama.
Apabila berbilang data perlu berkongsi memori atau hanya satu daripada berbilang data perlu diambil pada satu-satu masa, kesatuan boleh digunakan.
Di sini, ambil mesej pelanggan protokol WeChat sebagai contoh. Berdasarkan pengalaman bertahun-tahun saya dalam enkapsulasi protokol antara muka, terdapat dua kaedah pelaksanaan.
1. Gunakan kaedah fungsi untuk melaksanakan Kesatuan
Pelaksanaan kelas kesatuan:
/** 客户消息类 */@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; } ... }
String accessToken = ...; String toUser = ...; List<Article> articleList = ...; News news = new News(articleList); CustomerMessage customerMessage = new CustomerMessage(toUser, news); wechatApi.sendCustomerMessage(accessToken, customerMessage);
Kebaikan dan keburukan utama:
Kelebihan: Lebih dekat dengan penyatuan bahasa C/C++;
Kelemahan: Logik pelaksanaan lebih kompleks dan terdapat banyak pengesahan jenis parameter.
2. Gunakan warisan untuk melaksanakan Kesatuan
/** 客户消息类 */@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; } }
String accessToken = ...; String toUser = ...; List<Article> articleList = ...; News news = new News(articleList); CustomerMessage customerMessage = new NewsCustomerMessage(toUser, news); wechatApi.sendCustomerMessage(accessToken, customerMessage);
Kelebihan utama dan keburukan :
Kelebihan: Gunakan kelas asas maya dan subkelas untuk pemisahan, dan konsep setiap objek subkelas adalah jelas;
Kelemahan: Tidak seperti C /Kesatuan bahasa C++ sangat berbeza, tetapi fungsinya secara amnya sama.
Dalam bahasa C/C++, kesatuan tidak termasuk jenis data semasa kesatuan. Walau bagaimanapun, kesatuan Java yang dilaksanakan di atas sudah mengandungi jenis data yang sepadan dengan kesatuan. Oleh itu, secara tegasnya, kesatuan Java bukanlah kesatuan sebenar, tetapi kelas dengan fungsi "hanya mengambil satu daripada berbilang data pada satu masa".
Atas ialah kandungan terperinci Bagaimanakah java menentukan kelas Union untuk merealisasikan kewujudan bersama badan data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!