【Java基础05】枚举类

【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;
}

枚举特点:

  • 使用关键字enum
  • 一串允许的值,比如上面定义的各类颜色
  • 枚举可以单独定义在一个文件中,也可以嵌在其它Java类中
  • 枚举可以实现一个或多个接口(Interface),不能被继承
  • 可以定义新的变量和方法

二、枚举的常用方法

【Java基础05】枚举类_第1张图片

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

你可能感兴趣的:(Java之基础,java,开发语言,后端,程序人生)