Union
Union
在
- 结构体(Struct)中所有变量是“共存”的,同时所有变量都生效,各个变量占据不同的内存空间;
- 联合体(Union)中是各变量是“互斥”的,同时只有一个变量生效,所有变量占据同一块内存空间。
当多个数据需要共享内存或者多个数据每次只取其一时,可以采用联合体(Union
使用函数方式实现Union
/** 客户消息类 */
@ToString
public 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);
使用继承方式实现Union
/** 客户消息类 */
@Getter
@Setter
@ToString
public 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);
在