C/C++ 언어에서 Union이라고도 하는 Union은 구조체와 유사한 데이터 구조입니다. 구조체와 마찬가지로 Union에는 많은 데이터 유형과 변수가 포함될 수 있습니다. 둘 사이의 차이점은 다음과 같습니다.
구조체(구조체)의 모든 변수는 "공존"하며 모든 변수는 동시에 유효합니다. 각 변수는
공용체에서 각 변수는 "상호 배타적"이며 동시에 하나의 변수만 유효하며 모든 변수는 동일한 메모리 공간을 차지합니다.
여러 데이터가 메모리를 공유해야 하거나 여러 데이터 중 한 번에 하나만 가져와야 하는 경우 공용체를 사용할 수 있습니다.
Java 언어에는 공용체와 구조(struct)의 개념이 없고 클래스(class)의 개념만 있습니다. 우리 모두 알고 있듯이 클래스를 사용하여 구조를 구현할 수 있습니다. 실제로 공용체는 클래스를 사용하여 구현할 수도 있습니다. 그러나 이 클래스에는 "여러 데이터가 메모리를 공유해야 한다"는 기능이 없고 "여러 데이터 중 하나만 한 번에 가져오면 된다"는 기능만 있습니다.
여기서 WeChat 프로토콜의 고객 메시지를 예로 들어 보겠습니다. 인터페이스 프로토콜 캡슐화에 대한 다년간의 경험을 바탕으로 구현 방법에는 주로 두 가지가 있습니다.
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 클래스 구현:
/** 客户消息类 */@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++ 언어의 통합과 매우 다르지만 기능은 일반적으로 동일합니다.
C/C++ 언어에서 공용체는 공용체의 현재 데이터 유형을 포함하지 않습니다. 그러나 위에서 구현된 Java Union에는 이미 Union에 해당하는 데이터 유형이 포함되어 있습니다. 따라서 엄밀히 말하면 Java Union은 실제 Union이 아니라 "한 번에 여러 데이터 중 하나만 가져옵니다"라는 기능을 가진 클래스입니다.
위 내용은 Java는 데이터 본문의 공존을 실현하기 위해 Union 클래스를 어떻게 정의합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!