Java枚举类型

236 阅读5分钟
一,枚举类
  1. 在某些情况下,一个类的对象是有限且固定的,如季节类,它只有春夏秋冬四个对象,这种实例有限且固定的类,在Java中被称为枚举类。
  2. 在Java中使用enum关键字来定义枚举类,其地位与class,interface相同。
  3. 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量,成员方法,构造器(只能使用private访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举时被调用)。
  4. 一个Java源文件中最多只能有一个public类型的枚举类,且该Java源文件的名字必须和该枚举类的类名相同,这点和类是相同的。
  5. 使用enum定义的枚举类默认继承了java.lang.Enum类,并实现了java.lang.Seriablizable和java.lang.Comparable两个接口
  6. 所有的枚举值都是public static final的,且非抽象的枚举类不能再派生子类
  7. 枚举类的所有实例(枚举值)必须在枚举类的第一行显示地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加public static final修饰,无需程序员显示添加
二,枚举类的使用
定义枚举类
package p0527enum.p1;

/**
 * @author: jdq8576
 * @date: 2021-05-27 12:43
 **/
public enum WeekEnum {
    /**
     *  在第一行显示地列出7个枚举实例(枚举值),系统会自动添加public static final修饰
     */
    SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;
}

枚举类的成员变量,成员方法,构造器
package p0527enum.p2;

public enum WeekEnum {
    /**
     *  在第一行显示地列出7个枚举实例(枚举值),系统会自动添加public static final修饰
     */
    SUNDAY("星期日"),MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六");
    private String value;

    private WeekEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

枚举类中常用方法
  1. int compareTo(E o);该方法用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;反之返回负整数;否则返回0;
package p0527enum.p2;

/**
 * @author: jdq8576
 * @date: 2021-05-27 12:48
 **/
public class Test {
    public static void main(String[] args) {
        System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.FRIDAY));
        System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.MONDAY));
        System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SATURDAY));
        /** output
         * 0
         * 4
         * -1
         */
    }
}
  1. String name();返回此枚举实例的名称,即枚举值,在这里就是FRIDAY,SATURDAY....
  2. static values();返回一个包含全部枚举值的数组,可以用来遍历所有枚举值
package p0527enum.p2;

/**
 * @author: jdq8576
 * @date: 2021-05-27 12:48
 **/
public class Test {
    public static void main(String[] args) {
        for (WeekEnum weekEnum:WeekEnum.values()){
            System.out.println(weekEnum);
        }
        /**output
         * SUNDAY
         * MONDAY
         * TUESDAY
         * WEDNESDAY
         * THURSDAY
         * FRIDAY
         * SATURDAY
         */
    }
}

  1. String toString();默认的toString()方法和 name() 方法的效果是一样的,有的时候我们还可以重写toString()f方法。
package p0527enum.p2;

public enum WeekEnum {
    /**
     *  在第一行显示地列出7个枚举实例(枚举值),系统会自动添加public static final修饰
     */
    SUNDAY("星期日"),MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六");
    private String value;

    private WeekEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return value;
    }
}

package p0527enum.p2;

/**
 * @author: jdq8576
 * @date: 2021-05-27 12:48
 **/
public class Test {
    public static void main(String[] args) {
        for (WeekEnum weekEnum : WeekEnum.values()) {
            System.out.println(weekEnum);
        }
        /**
         * output
         * 星期日
         * 星期一
         * 星期二
         * 星期三
         * 星期四
         * 星期五
         * 星期六
         */
    }
}
  1. int ordinal():返回枚举值在枚举类中的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定;
package p0527enum.p2;

/**
 * @author: jdq8576
 * @date: 2021-05-27 12:48
 **/
public class Test {
    public static void main(String[] args) {
        System.out.println(WeekEnum.MONDAY.ordinal());
        /**
         * output
         * 1
         */
    }
}
  1. static valueof();返回带指定名称的指定枚举类型的枚举常量。
package p0527enum.p2;

/**
 * @author: jdq8576
 * @date: 2021-05-27 12:48
 **/
public class Test {
    public static void main(String[] args) {
        System.out.println(WeekEnum.valueOf(WeekEnum.class, "FRIDAY"));
        /**
         * output
         * 星期五
         */
    }
}
  1. boolean equals()方法,比较两个枚举对象的引用。
三,使用枚举类实现接口

与普通类一样,枚举类也可以实现一个或多个接口。枚举类实现接口时,同样要实现该接口的所有方法。

package p0527enum.p3;

/**
 * @author: jdq8576
 * @date: 2021-05-27 13:33
 **/
public interface GenderDescription {
    public void info();
}

package p0527enum.p3;

/**
 * @author: jdq8576
 * @date: 2021-05-27 17:00
 **/
public enum Gender implements GenderDescription {
    MAIL, FEMALE;

    @Override
    public void info() {
        System.out.println("这是一个用于定义性别的枚举类");
    }
}
package p0527enum.p3;

/**
 * @author: jdq8576
 * @date: 2021-05-27 17:01
 **/
public class Test {
    public static void main(String[] args) {
        Gender.MAIL.info();
        Gender.FEMALE.info();
        /**output
         * 这是一个用于定义性别的枚举类
         * 这是一个用于定义性别的枚举类
         */
    }
}
四,包括抽象方法的枚举类

定义一个Operation枚举类,有四个枚举值PLUS,MINUS,TIMES,DIVIDE,分别代表加,减,乘,除,该枚举类有一个claculate()方法,用于完成计算。

package p0527enum.p4;

/**
 * @author: jdq8576
 * @date: 2021-05-27 17:07
 **/
public enum Operation {
    PLUS {
        @Override
        public double calculate(double x, double y) {
            return x + y;
        }
    },
    MINUS {
        @Override
        public double calculate(double x, double y) {
            return x - y;
        }
    },
    DIVIDE {
        @Override
        public double calculate(double x, double y) {
            return x / y;
        }
    },
    TIMES {
        @Override
        public double calculate(double x, double y) {
            return x * y;
        }
    };

    public abstract double calculate(double x, double y);
}

package p0527enum.p4;

/**
 * @author: jdq8576
 * @date: 2021-05-27 17:09
 **/
public class Test {
    public static void main(String[] args) {
        System.out.println("6 + 2 = " + Operation.PLUS.calculate(6, 2));
        System.out.println("6 - 2 = " + Operation.MINUS.calculate(6, 2));
        System.out.println("6 * 2 = " + Operation.TIMES.calculate(6, 2));
        System.out.println("6 / 2 = " + Operation.DIVIDE.calculate(6, 2));
        /**output
         * 6 + 2 = 8.0
         * 6 - 2 = 4.0
         * 6 * 2 = 12.0
         * 6 / 2 = 3.0
         */
    }
}