java基础巩固:枚举

java枚举

枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。

枚举的属性

  • 枚举类对象的属性不应允许被改动,所以应该使用private final 修饰
  • 枚举类的使用privatefinal修饰的属性应该在构造器中为其赋值
  • 若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数

声明枚举

jdk1.5之前声明枚举

没有enum关键字需要自己自定义枚举

public enum SeasonEnum2 {

    SPRING("春天","春日暖暖"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","白雪皑皑");
    private final String seasonName;
    private final String seasonDesc;


    SeasonEnum2(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }


    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}

jdk1.5后声明枚举

使用enum关键字定义枚举类

enum-modifiers enum enumname{
    enum-body1,
    enum-body2;
}
  • enum-modifiers 代表访问修饰符
  • enumname 代表枚举名称
  • enum-body 代表枚举成员用逗号隔开,分号结尾
public enum SeasonEnum2{

    SPRING("春天","春日暖暖"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","白雪皑皑");
    final String seasonName;
    final String seasonDesc;


    SeasonEnum2(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }


    public String getSeasonName() {
        return seasonName;
    }

    public String getSeasonDesc() {
        return seasonDesc;
    }
}

枚举类

Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。

    /**
        返回此枚举常量的序号(它在其枚举声明中的位置,其中初始常量的序号为零)。
        大多数程序员不会使用这种方法。它设计用于复杂的基于枚举的数据结构,
        例如java.util.EnumSet和java.util.EnumMap 。 
        返回: 此枚举常数的序数
     */
    public final int ordinal() ;
    
    /**
        返回具有指定名称的指定枚举类型的枚举常量。该名称必须与用于在此类型中声明枚举常量的标识符完全匹配。 (不允许使用无关的空白字符。)
        请注意,对于特定的枚举类型T ,可以使用该枚举上隐式声明的public static T valueOf(String)方法而不是此方法来从名称映射到相应的枚举常量。枚举类型的所有常量都可以通过调用该类型的隐式public static T[] values()方法获得。
        参数:enumType – 要从中返回常量的枚举类型的Class对象 name - 要返回的常量的名称
        回报:具有指定名称的指定枚举类型的枚举常量
        抛出:IllegalArgumentException – 如果指定的枚举类型没有具有指定名称的常量,或者指定的类对象不代表枚举类型
        NullPointerException – 如果enumType或name为 null
    */
    @NotNull        
    public static <T extends Enum<T>> T valueOf(@NotNull Class<T> enumType,@NotNull String name ){
        T result = enumType.enumConstantDirectory().get(name);
        if (result != null)
            return result;
        if (name == null)
            throw new NullPointerException("Name is null");
        throw new IllegalArgumentException(
            "No enum constant " + enumType.getCanonicalName() + "." + name);
    }
    
    
    /**
        将此枚举与指定的对象进行比较以进行排序。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。
        枚举常量仅可与相同枚举类型的其他枚举常量进行比较。此方法实现的自然顺序是声明常量的顺序。
    */
    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;
    }

EnumMap 与 EnumSet

为了更好地支持枚举类型,java.util 中添加了两个新类:EnumMap 和 EnumSet。使用它们可以更高效地操作枚举类型。

EnumMap 类

  • EnumMap 是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。
  • HashMap 只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以 EnumMap 使用数组来存放与枚举类型对应的值,使得 EnumMap 的效率非常高。

EnumSet 类

EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。EnumSet 提供了许多工厂方法以便于初始化

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值