【Java基础系列】
【Java基础01】基础概述
【Java基础02】常用类
【Java基础03】时间类
【Java基础04】异常
【Java基础05】枚举类
【Java基础06】泛型
【Java基础07】注解
【Java基础08】反射
【Java基础09】代理
【Java基础10】IO流
文章概述:总结描述Java基础中枚举类的定义和使用,包括枚举类的定义、枚举类的常用方法、枚举类的参数和方法、枚举实现单例模式。
枚举(Enum):枚举类型是由一组固定的常量组成的。Java中由关键字enum来定义一个枚举类型。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。
//首先枚举是一个特殊的class
//这个class相当于final static修饰,不能被继承
//他的构造方法强制被私有化,下面有一个默认的构造方法private ColorEnum();
//所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类
public enum ColorEnum {
//每个枚举变量都是枚举类ColorEnum的实例,相当于RED=new ColorEnum(1),按序号来。
//每个成员变量都是final static修饰
RED, GREEN, BLANK, YELLOW;
}
枚举特点:
public static void main(String[] args) {
// values 将枚举的所有成员以数组形式返回
for (ColorEnum value : ColorEnum.values()) {
// ordinal 获取枚举的下标值
System.out.println("索引" + value.ordinal() + ",值:" + value);
}
// valueOf 通过字符串获取单个枚举对象
System.out.println(ColorEnum.valueOf("RED"));
// compareTo 比较枚举成员所在位置
System.out.println(GREEN.compareTo(BLANK));
}
枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。SeasonEunm.SPRING获得的对象相当于调用私有构造方法。
@Getter
public enum SeasonEunm {
//每一个枚举变量都是枚举类SeasonEunm的实例化
//SeasonEunm.SPRING获得的对象相当于new SeasonEunm("春","春困");获得的对象
SPRING("春","春困"),
SUMMER("夏","夏睡"),
AUTUMN("秋","秋乏"),
WINTER("冬","冬眠");
//强制私有化的构造方法,因为枚举类默认继承Eunm类,被final static修饰,不能被继承
//由于被强制private,所以不能使用new去生成枚举对象
//在SeasonEunm.SPRING获得对象,隐式调用了下面的构造方法
// 构造方法 ,赋值给成员变量
private SeasonEunm(String name, String value) {
this.name = name;
this.value = value;
}
//添加成员变量的原因是,方便够着方法赋值,使用SeasonEunm.SPRING.getName就能获取对应的值
private String name;
private String value;
//覆盖方法 :只能使用toString方法来输出枚举变量值
@Override
public String toString() {
return "SeasonEunm{" +
"name='" + name + '\'' +
", value='" + value + '\'' +
'}';
}
}
单例模式:确保对象的唯一性。
实现单例模式的方法有很多,后面可以详细见【设计模式】单例模式处,这里先具体说明下枚举类实现单例模式。
这借助 JDK1.5 中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建 新的对象。这种方式是 Effective Java 作者 Josh Bloch 提倡的方式,他说单元素的枚举类型已经成为实现Singleton的最佳方法。
public enum Singleton8 {
INSTANCE; //属性
public void sayOK() {
System.out.println("ok~");
}
}
Java虚拟机会保证枚举类型不能被反射和枚举对象的唯一性,因此每一个枚举类型和定义的枚举变量在JVM中都是唯一的。
public class Singleton9 {
private Singleton9(){
}
public static enum SingletonEnum {
SINGLETON;
private Singleton9 instance = null;
private SingletonEnum(){
instance = new Singleton9();
}
public Singleton9 getInstance(){
return instance;
}
}
public static void main(String[] args) {
Singleton9 instance1 = SingletonEnum.SINGLETON.getInstance();
Singleton9 instance2 = SingletonEnum.SINGLETON.getInstance();
System.out.println(instance1 == instance2);
}
}
输出:true