likes
comments
collection

聊聊Java枚举(enum)

作者站长头像
站长
· 阅读数 33

1、什么是枚举

什么是枚举,百科上的解释:在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。

2、声明枚举

声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下:

enum-modifiers enum enumname:enum-base {
    enum-body,
}

其中,enum-modifiers 表示枚举的修饰符主要包括 public、private 和 internal;enumname 表示声明的枚举名称;enum-base 表示基础类型;enum-body 表示枚举的成员,它是枚举类型的命名常数。

任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。

提示:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。

3、枚举方法

方法名称描述
values()以数组形式返回枚举类型的所有成员
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序
ordinal()获取枚举成员的索引位置

1、values

enum Season{
    spring,summer,autumn,winter;
//   常量有 spring, summer, autumn,winter,分别表示春天,夏天,秋天,冬天,系统会自动添加 public static final 修饰
}
public class SeasonEnum {
    public static void main(String[] args) {
//        迭代季节
        for (Season season : Season.values()) {
            System.out.println(season);
        }
    }
}

2、valueOf

enum Season{
    spring,summer,autumn,winter;
//   常量有 spring, summer, autumn,winter,分别表示春天,夏天,秋天,冬天,系统会自动添加 public static final 修饰
}
 

 
 
public class SeasonEnum {
   public static void main(String[] args) {
 
//        使用 valueOf() 返回枚举常量,不存在的会报错 IllegalArgumentException
         System.out.println(Season.valueOf("summer"));
   //    System.out.println(Season.valueOf("summ"));
   }
}

3、ordinal

enum Season{
    spring,summer,autumn,winter;
//   常量有 spring, summer, autumn,winter,分别表示春天,夏天,秋天,冬天,系统会自动添加 public static final 修饰
}
 
public class SeasonEnum {
   public static void main(String[] args) {
//        迭代季节
        for (Season season : Season.values()) {
//            ordinal可以找到每个枚举常量的索引,就像数组索引一样。
            System.out.println(season+"  索引为  "+season.ordinal());
        }
   }
}

4、compareTo

   int res1 = w1.compareTo(w2);
        int res2 = w2.compareTo(w3);
        int res3 = w3.compareTo(w4);
        int res4 = w4.compareTo(w2);
        int res5 = w5.compareTo(w6);

        System.out.println("Is" + " " + w1.name() + " " + "same as" + " " + w2.name() + res1);
        System.out.println("Is" + " " + w2.name() + " " + "same as" + " " + w3.name() + res2);
        System.out.println("Is" + " " + w3.name() + " " + "same as" + " " + w4.name() + res3);
        System.out.println("Is" + " " + w4.name() + " " + "same as" + " " + w2.name() + res4);
        System.out.println("Is" + " " + w5.name() + " " + "same as" + " " + w6.name() + res5);
        
    
Is SUN same as MON-1
Is MON same as TUE-1
Is TUE same as WED-1
Is WED same as MON2
Is THU same as FRI-1

此方法的返回类型为int,它根据给定的情况返回一个整数值,

  • 当此Enum对象等于或等于给定的Enum对象时,它将返回0
  • 当此Enum对象大于给定的Enum对象时,它将返回正值
  • 当此Enum对象小于给定的Enum对象时,它将返回负值

4、自定义构造函数指定值和中文描述



enum Weekday {
    MON(1, "星期一"), TUE(2, "星期二"), WED(3, "星期三"), THU(4, "星期四"), FRI(5, "星期五"), SAT(6, "星期六"), SUN(0, "星期日");

    public final int dayValue;
    private final String chinese;

    private Weekday(int dayValue, String chinese) {
        this.dayValue = dayValue;
        this.chinese = chinese;
    }

    @Override
    public String toString() {
        return this.chinese;
    }
}

public class SeasonEnum {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        if (day.dayValue == 6 || day.dayValue == 0) {
            System.out.println("Today is " + day + ". Work at home!");
        } else {
            System.out.println("Today is " + day + ". Work at office!");
        }
//        使用 valueOf() 返回枚举常量,不存在的会报错 IllegalArgumentException
     //   System.out.println(Season.valueOf("summer"));
        //    System.out.println(Season.valueOf("summ"));
    }
}

5、枚举类比较是用==还是equals

一般在Java代码里面,涉及到比较2个值的问题,除了是简单的一般数据类型意外,字符串除外,我们都是使用==来判断是否相等的,但是对于字符串和对象以及封装类型的数据都是使用equals方法,来判断2个值是否相等。

在枚举里面,使用== 和使用equals方法的执行结果是一样的。

因为在Enum类里面,已经重写了equals方法,而方法里面比较就是直接使用==,来比较2个对象的。所以,在外边直接使用==也是可以的。