没有合适的资源?快使用搜索试试~ 我知道了~
1.1. 枚举定义 1.2. 枚举的秘密 1.2.1. 枚举的单例性 1.2.3. 枚举的本质
资源详情
资源评论
资源推荐
Java 常用武器库之枚举
查看本场Chat
(https://gitbook.cn/gitchat/activity/5b670794245b6475efb66084)
文心紫竹 (https://gitboo
…
向作者提问 (https://gitbook.cn/m/mazi/author/5b3f67e7b5e02743239c0a55/question)
(https://gitbook.cn/gitchat/author/5b3f67e7b5e02743239c0a55)
dubbo最早
实战者,现
转战springcloud,构建高并发、高性能、高可用系统;带领弟兄进行DDD实战,以解
决互联网复杂业务场景;现挑战长链接领域,与socket、线程、锁、并发、分布式为
伍
1. 枚举基本特征
关键词 enum 可以将一组具名值的有限集合创建成一种新的类型,而这些具名的值可以作为常规
程序组件使用。
枚举最常见的用途便是替换常量定义,为其增添类型约束,完成编译时类型验证。
1.1. 枚举定义
枚举的定义与类和常量定义非常类型。使用 enum 关键字替换 class 关键字,然后在 enum 中定
义 “ 常量 ” 即可。
例如,需要将用户分为 “ 可用 ” 和 “ 禁用 ” 两种状态,为了达到定义的统一管理,一般会使用常
量进行说明,如下:
public class UserStatusConstants {
public static final int ENABLE = 0;
public static final int DISABLE = 1;
}
public class User1 {
private String name;
private int status;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
在 User1 中,描述用户状态的类型为 int,(期望可用值为 0 和 1,但实际可选择值为 int),从
使用方角度出发,需要事先知道 UserStatusConstants 中定义的常量才能保障调用的准确性,
setStatus 和 getStatus 两个方法绕过了 Java 类型检测。
接下来,我们看一下枚举如何优化这个问题,enum 方案如下:
public enum UserStatus {
ENABLE, DISABLE;
}
(https://gitbook.cn/)
荀烨@学而-大数据(教育)
public class User2 {
private String name;
private UserStatus status;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public UserStatus getStatus() {
return status;
}
public void setStatus(UserStatus status) {
this.status = status;
}
}
@Test
public void useUserStatus(){
User2 user = new User2();
user.setName("test");
user.setStatus(UserStatus.DISABLE);
user.setStatus(UserStatus.ENABLE);
}
getStatus 和 setStatus 所需类型为 UserStatus,不在是比较宽泛的 int。在使用的时候可以通过
UserStatus.XXX 的方式获取对用的枚举值。
1.2. 枚举的秘密
1.2.1. 枚举的单例性枚举的单例性
枚举值具有单例性,及枚举中的每个值都是一个单例对象,可以直接使用 == 进行等值判断。
枚举是定义单例对象最简单的方法。
1.2.2. name 和和 ordrial
对于简单的枚举,存在两个维度,一个是 name,即为定义的名称;一个是
ordinal,即为定义的顺序。
name 测试如下:
@Test
public void nameTest(){
for (UserStatus userStatus : UserStatus.values()){
// 枚举的name维度
String name = userStatus.name();
System.out.println("UserStatus:" + name);
// 通过name获取定义的枚举
UserStatus userStatus1 = UserStatus.valueOf(name);
System.out.println(userStatus == userStatus1);
}
}
输出结果为:
UserStatus:ENABLE
true
UserStatus:DISABLE
true
ordrial 测试如下:
@Test
public void ordinalTest(){
for (UserStatus userStatus : UserStatus.values()){
// 枚举的ordinal维度
int ordinal = userStatus.ordinal();
System.out.println("UserStatus:" + ordinal);
// 通过ordinal获取定义的枚举
UserStatus userStatus1 = UserStatus.values()[ordinal];
System.out.println(userStatus == userStatus1);
}
}
1.2.3. 枚举的本质
创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 java.lang.Enum。
先看下 Enum 提供了什么:
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
// 枚举的Name维度
private final String name;
public final String name() {
return name;
}
// 枚举的ordinal维度
private final int ordinal;
public final int ordinal() {
return ordinal;
}
// 枚举构造函数
protected Enum(String name, int ordinal) {
this.name = name;
this.ordinal = ordinal;
}
/**
* 重写toString方法, 返回枚举定义名称
*/
public String toString() {
return name;
}
// 重写equals,由于枚举对象为单例,所以直接使用==进行比较
public final boolean equals(Object other) {
return this==other;
}
// 重写hashCode
public final int hashCode() {
return super.hashCode();
}
/**
* 枚举为单例对象,不允许clone
*/
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
/**
* 重写compareTo方法,同种类型按照定义顺序进行比较
*/
public final int compareTo(E o) {
Enum<?> other = (Enum<?>)o;
Enum<E> self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
/**
* 返回定义枚举的类型
*/
@SuppressWarnings("unchecked")
public final Class<E> getDeclaringClass() {
Class<?> clazz = getClass();
剩余13页未读,继续阅读
设计师马丁
- 粉丝: 15
- 资源: 299
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0