Java中的枚举类

什么是枚举类

使用enum定义的枚举类继承java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口,但是不能再进行继承(java不支持多继承)。

枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。

使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
枚举类的构造器只能是私有的

枚举类内也可以定义属性和方法,可是是静态的和非静态的
一个例子:

public enum  EnumHero {
    /**
     * 影流之主 劫
     */
    RIVEN("The Exile"){
        @Override
        public String getCname() {
            return "劫";
        }
    },
    /**
     * 放逐之刃 锐雯
     */
    ZED("The Master of Shadows"){
        @Override
        public String getCname() {
            return "锐雯";
        }
    },
    /**
     * 盲僧 李青
     */
    LEE_SIN("The Blind Monk"){
        @Override
        public String getCname() {
            return "李青";
        }
    },
    /**
     * 暗夜猎手 薇恩
     */
    VAYNE("The Night Hunter"){
        @Override
        public String getCname() {
            return "薇恩";
        }
    },
    /**
     * 武器大师 贾克斯
     */
    JAX("Grand master at Arms"){
        @Override
        public String getCname() {
            return "贾科斯";
        }
    },
    /**
     * 刀锋意志 艾瑞利亚
     */
    TRELIA("The Will of the Blades"){
        @Override
        public String getCname() {
            return "艾瑞利亚";
        }
    };

    private final String desc;

    /**
     * 构造方法必须私有!
     * @param desc
     */
    private EnumHero(String desc) {
        this.desc = desc;
    }

    public String getDesc() {
        return desc;
    }

    /**
     * 抽象方法由不同的枚举值提供不同的实现
     * @return
     */
    public abstract String getCname();
}

写枚举类实例的时候,默认是调用了构造器的,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。

构造器需定义成私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。

枚举类可以实现一个或多个接口。与普通类一样,实现接口的时候需要实现接口中定义的所有方法,若没有完全实现,那这个枚举类就是抽象的,只是不需显式加上abstract修饰,系统会默认加上。

这个枚举类实际上是抽象的,不可以创建枚举值,所以此处在申明枚举值的时候,都实现了抽象方法,这其实是匿名内部类的实现,花括号部分是一个类体。我们可以通过编译后的class文件查看。
——————————————————————————
switch语句里的表达式可以是枚举值。

由于枚举类型确保JVM中仅存在一个常量实例,因此我们可以安全地使用"= =" 运算符比较两个变量。此外,"= ="运算符可提供编译时和运行时的安全性。

EnumSet 和EnumMap

EnumSet
EnumSet 是一种专门为枚举类型所设计的 Set 类型。

与HashSet相比,由于使用了内部位向量表示,因此它是特定 Enum 常量集的非常有效且紧凑的表示形式。

它提供了类型安全的替代方法,以替代传统的基于int的“位标志”,使我们能够编写更易读和易于维护的简洁代码。

EnumSet 是抽象类,其有两个实现:RegularEnumSet 、JumboEnumSet,选择哪一个取决于实例化时枚举中常量的数量。

在很多场景中的枚举常量集合操作(如:取子集、增加、删除、containsAll和removeAll批操作)使用EnumSet非常合适;如果需要迭代所有可能的常量则使用Enum.values()。
EnumMap
EnumMap是一个专门化的映射实现,用于将枚举常量用作键。与对应的 HashMap 相比,它是一个高效紧凑的实现,并且在内部表示为一个数组:

EnumMap<Pizza.PizzaStatus, Pizza> map;

总结:本文主要记录并参考了java中枚举相关知识点!
参考:用好Java中的枚举真的没有那么简单
【JAVA】浅谈java枚举类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值