这篇文章给大家分享的是有关java如何定义Union类实现数据体的共存的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
定义Union类实现数据体的共存
在C/C++语言中,联合体(union),又称共用体,类似结构体(struct)的一种数据结构。联合体(union)和结构体(struct)一样,可以包含很多种数据类型和变量,两者区别如下:
结构体(struct)中所有变量是“共存”的,同时所有变量都生效,各个变量占据不同的内存空间;
联合体(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);
主要优缺点:
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++语言中,联合体并不包括联合体当前的数据类型。但在上面实现的Java联合体中,已经包含了联合体对应的数据类型。所以,从严格意义上说,Java联合体并不是真正的联合体,只是一个具备“多个数据每次只取其一”功能的类。
感谢各位的阅读!关于“java如何定义Union类实现数据体的共存”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!