《五》枚举

《五》枚举

【一】枚举

枚举是一个被命名的整型常量的聚合,用于声明一组带标识符的常量。

1.使用枚举类型设置常量

以往设置常量,通常将常量放置在接口中,这样在程序中就可以直接使用,并且该常量不能被修改,因为在接口中定义常量时,该常量的修饰符为final与static。

新增枚举类型后就逐渐取代了这种常量的定义方式,因为通过使用枚举类型,可以赋予程序在编译时进行检查的功能。使用枚举类型定义常量的语法如下:

public enum Const{
    const_A,
    const_B,
    const_C
}

1.1 比较常量和枚举的不同之处:

interface Const { // 将常量放置在接口中
      public static final int Const_A = 1;
      public static final int Const_B = 2;
}

public class ConstTest {
      enum Const2 { // 将常量放置在枚举类型中
           Const_A, Const_B
      }

      // 使用接口定义常量
      public static void doit(int c) { // 定义一个方法,这里的参数为int型
           switch (c) { // 根据常量的值做不同操作
           case Const.Const_A:
                 System.out.println("doit() Const_A");
                 break;
           case Const.Const_B:
                 System.out.println("doit() Const_B");
                 break;
           }
      }

      public static void doit2(Const2 c) { // 定义一个参数对象是枚举类型的方法
           switch (c) { // 根据枚举类型对象做不同操作
           case Const_A:
                 System.out.println("doit2() Const_A");
                 break;
           case Const_B:
                 System.out.println("doit2() Const_B");
                 break;
           }
      }

      public static void main(String[] args) {
           ConstTest.doit(Const.Const_A); // 使用接口中定义的常量,结果为:doit() Const_A
           ConstTest.doit2(Const2.Const_A); // 使用枚举类型中的常量,结果为:doit2() Const_A
           ConstTest.doit2(Const2.Const_B); // 使用枚举类型中的常量,结果为:doit2() Const_B
           ConstTest.doit(3);//使用int类型,结果为:doit() Const_A
           ConstTest.doit2(3);//报错
      }
}

在上述代码中,当用户调用doit()方法时,使编译器不接受在接口中定义的常量参数,也不会报错;但调用doit2()方法,任意传递参数,编译器就会报错,因为这个方法只接受枚举类型的常量作为其参数。

枚举类型可以在类的内部进行定义,也可以在类的外部定义,如果在类的内部定义,则类似于内部类形式。

 

2.深入了解枚举类型 

2.1操作枚举类型成员的方法

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

注意:

  • 枚举类不能继承其他类,因为在编译时它已经继承了 java.lang.Enum 类,java无法多继承
  • 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类
  • 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰
  • 枚举表示的类型其取值是必须有限的

所有枚举实例都可以调用 Enum 类的方法,常用方法:

方法名称 具体含义 使用方法
values() 该方法可以将枚举成员以数组的形式返回 枚举类型名称.values()
valuesOf() 该方法可以实现将普通字符串转化为枚举实例 枚举类型名称.values("abc")
compareTo() 该方法用于比较两个枚举对象在定义时的顺序 枚举对象.compareTo()
ordinal() 该方法用于得到枚举成员的位置索引 枚举对象.ordinal()

经典实例:

public enum Day {
    MONDAY("星期一", 1), TUESDAY("星期二", 2), WEDNESDAY("星期三", 3),
    THURSDAY("星期四", 4), FRIDAY("星期五", 5),
    SATURDAY("星期六", 6), SUNDAY("星期天", 7);//这个分号不可省略哦

    //先自定义两个自定义枚举的属性
    //此枚举类中包含的枚举对象的文字描述
    private String desc;
    //此枚举类中包含的枚举对象的对应的代码
    private int code;

    public String getDesc() {
        return desc;
    }

    public int getCode() {
        return code;
    }

    //通过自定义的code属性,来获取整个枚举对象,静态方法
    public static Day getDayByCode(int code) {
        Day day = null;
        switch (code) {
            case 1:
                day = Day.MONDAY;
                break;
            case 2:
                day = Day.TUESDAY;
                break;
            case 3:
                day = Day.WEDNESDAY;
                break;
            case 4:
                day = Day.THURSDAY;
                break;
            case 5:
                day = Day.FRIDAY;
                break;
            case 6:
                day = Day.SATURDAY;
                break;
            case 7:
                day = Day.SUNDAY;
                break;
        }
        return day;
    }

    //此枚举类自定义一个构造器
    private Day(String desc, int code) {
        this.desc = desc;
        this.code = code;
    }
}
public class DayDemo {
    public static void main(String[] args) {
        Day[] days = Day.values();

        //遍历枚举
//        for(Day day:days){
//            System.out.println(day.toString());
//        }


        Day monday = Day.valueOf("MONDAY");//将普通字符串转化为枚举实例,返回的是monday对象
        Day sunday = Day.SUNDAY;//通过枚举类名直接使用

        //枚举的父类定义了一个odinal(),作用是取出枚举对象的索引值
        System.out.println(monday.ordinal());//0
        System.out.println(sunday.ordinal());//6

        //还有一个compareTo()方法,该方法用于比较两个枚举对象在定义时的顺序
        System.out.println(monday.compareTo(monday));//顺序一样时等于0
        System.out.println(monday.compareTo(sunday));//返回sunday索引-monday索引:-6

        //这3种方法结果一样,输出枚举的文字描述
        System.out.println(monday.name());
        System.out.println(monday.toString());
        System.out.println(monday);
    }
}

 

posted on 2020-06-10 11:42  北冥道人骑鲲打代码  阅读(213)  评论(0编辑  收藏  举报

导航