Java枚举的使用

来源:互联网 发布:js怎么解析json数据 编辑:程序博客网 时间:2024/06/01 09:07

常量与枚举

一、常量定义方法

常量是其值固定不变的量,一般可以分为字面常量和命名常量,如数字1,2,1.3,字符串“abc”,这些就是字面常量,而命名常量是我们使用一些有意义的名称来代表字面常量值,通常命名常量有助于我们更好地理解程序的逻辑。

在Java中,我们通常使用public static final ... 方式来定义常量,如:

public static final int MAX_VALUE = 1000;

在JDK1.5之前,我们如果需要表示一组相关的常量,可以使用如下方法完成:

/** * 星期 * @author 小明 * */public class WeekDay {      public static final int MONDAY = 1; // 星期一    public static final int TUESDAY = 2; // 星期二    public static final int WEDNESDAY = 3; // 星期三    public static final int THURSDAY = 4; // 星期四    public static final int FRIDAY = 5; // 星期五    public static final int SATURDAY = 6; // 星期六    public static final int SUNDAY = 0; // 星期日}

现在好了,我们可以把相关的常量封装到一个枚举类型中,而且枚举还提供了比常量更多的方法。

二、枚举定义方法

枚举的简单定义方法如下:

/** * 星期枚举 * @author 小明 * */public enum WeekDay {    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}

那我们能不能像使用常量一样给每个枚举类型一个数值呢,答案是肯定的。

默认情况下,每个枚举值对应一个整型数字值。第一个枚举值对应数字0,第二个枚举值对应数字1,以后每个枚举值所对应数字是(前一个枚举数值+1)的结果。当然,我们也可以自己重新给每个枚举值指定一个数值。

如何实现自定义每个枚举值对应的数字值呢?枚举类型提供了构造方法,我们可以通过构造方法与toString()方法来实现。则改造后的代码如下:

/** * 星期枚举 *  * @author 小明 * */public enum WeekDay {    // 利用构造方法传参    MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(0);    private int val;    private WeekDay(int val) {        this.val = val;    }    @Override    public String toString() {        return String.valueOf(this.val);    }}

由此看来,枚举中我们也可以定义成员变量与构造方法。

但需要注意的是,枚举类的构造方法与普通类的构造方法有很大的不同:

  • 枚举构造方法只在构造枚举值时被调用
  • 枚举构造方法只能是private私有的,不能为public公有的

枚举中还可以定义成员方法,改造后的代码如下:

/** * 星期枚举 *  * @author 小明 * */public enum WeekDay {    // 利用构造方法传参    MONDAY("星期一", 1, 1), TUESDAY("星期二", 2, 2), WEDNESDAY("星期三", 3, 3), THURSDAY(            "星期四", 4, 4), FRIDAY("星期五", 5, 5), SATURDAY("星期六", 6, 6), SUNDAY(            "星期日", 0, 7);    private String name; // 中文名称    private int val; // 对应数字值    private int index; // 索引    private WeekDay(String name, int val, int index) {        this.name = name;        this.val = val;        this.index = index;    }    /**     * 获取中文名称     *      * @return 中文名称字符串     */    public String getName() {        return this.name;    }    /**     * 获取枚举值对应数值     *      * @return 枚举对应数值     */    public int getVal() {        return this.val;    }    /**     * 获取枚举值索引     *      * @return 索引     */    public int getIndex() {        return this.index;    }    /**     * 设置中文名称     *      * @param name     *            中文名称     */    public void setName(String name) {        this.name = name;    }    /**     * 设置数字值     *      * @param val     *            数值     */    public void setVal(int val) {        this.val = val;    }    /**     * 设置索引     *      * @param index     *            索引     */    public void setIndex(int index) {        this.index = index;    }    /**     * 根据索引获取枚举值中文名称     *      * @param index     *            索引     * @return 该索引枚举值中文名称     */    public static String getName(int index) {        for (WeekDay weekDay : WeekDay.values()) {            if (weekDay.getIndex() == index)                return weekDay.getName();        }        return null;    }    @Override    public String toString() {        return "WeekDay " + super.toString() + "[name=" + this.name + " val="                + this.val + " index=" + this.index + "]";    }}

关于使用枚举类型的说明

  • 所有枚举都继承了Enum的方法,下面详细介绍这些方法:

    1. ordinal():返回枚举值在枚举中的顺序,这个顺序是按照枚举值定义的顺序从0开始依次递增的
    2. name():返回枚举值的名称
    3. compartTo(E):因Enum实现了Comparable接口,因此可以比较此对象与指定对象的顺序
    4. values():返回一个包含全部枚举值的数组
    5. toString():返回枚举值的名称
    6. valueOf(String)/valueOf(Class, String):返回带指定名称的指定枚举类型的枚举值
    7. equals(Object):比较两个枚举对象的引用
  • 我们可以将枚举看作是类,并且是一个不能被继承的final类,其枚举值是类的静态常量,我们可以通过如下语法来获取枚举的一个实例,如WeekDay wd = WeekDay.MONDAY;

一个完整的示例

public class WeekDayTest {    /**     * 定义枚举类型     */    public enum WeekDay {        // 利用构造方法传参        MONDAY("星期一", 1, 1), TUESDAY("星期二", 2, 2), WEDNESDAY("星期三", 3, 3), THURSDAY(                "星期四", 4, 4), FRIDAY("星期五", 5, 5), SATURDAY("星期六", 6, 6), SUNDAY(                "星期日", 0, 7);        private String name; // 中文名称        private int val; // 对应数字值        private int index; // 索引        private WeekDay(String name, int val, int index) {            this.name = name;            this.val = val;            this.index = index;        }        /**         * 获取中文名称         *          * @return 中文名称字符串         */        public String getName() {            return this.name;        }        /**         * 获取枚举值对应数值         *          * @return 枚举对应数值         */        public int getVal() {            return this.val;        }        /**         * 获取枚举值索引         *          * @return 索引         */        public int getIndex() {            return this.index;        }        /**         * 设置中文名称         *          * @param name         *            中文名称         */        public void setName(String name) {            this.name = name;        }        /**         * 设置数字值         *          * @param val         *            数值         */        public void setVal(int val) {            this.val = val;        }        /**         * 设置索引         *          * @param index         *            索引         */        public void setIndex(int index) {            this.index = index;        }        /**         * 根据索引获取枚举值中文名称         *          * @param index         *            索引         * @return 该索引枚举值中文名称         */        public static String getName(int index) {            for (WeekDay weekDay : WeekDay.values()) {                if (weekDay.getIndex() == index)                    return weekDay.getName();            }            return null;        }        @Override        public String toString() {            return "WeekDay - " + super.toString() + "[name=" + this.name                    + ", val=" + this.val + ", index=" + this.index + "]";        }    }    public static void main(String[] args) {        // 遍历所有枚举值        for (WeekDay weekDay : WeekDay.values()) {            System.out.println(weekDay);        }               System.out.println("************************************");        // 将字符串“FRIDAY”转换为枚举类型        WeekDay wd = WeekDay.valueOf("FRIDAY");        // 输出转换后星期的中文名称,数字值及自定义索引值,枚举值顺序值,枚举值名称        System.out.println("中文名称:" + wd.getName());        System.out.println("数字值:" + wd.getVal());        System.out.println("自定义索引值:" + wd.getIndex());        System.out.println("顺序值:" + wd.ordinal());        System.out.println("枚举值名称:" + wd.name());        System.out.println("************************************");        // 比较两个枚举实例是否一致        System.out.println("两个枚举实例是否一致:" + wd.equals(WeekDay.FRIDAY));        // 比较两个枚举值大小        System.out.println("两个枚举值大小:" + WeekDay.MONDAY.compareTo(WeekDay.FRIDAY));    }}

运行结果:

WeekDay - MONDAY[name=星期一, val=1, index=1]WeekDay - TUESDAY[name=星期二, val=2, index=2]WeekDay - WEDNESDAY[name=星期三, val=3, index=3]WeekDay - THURSDAY[name=星期四, val=4, index=4]WeekDay - FRIDAY[name=星期五, val=5, index=5]WeekDay - SATURDAY[name=星期六, val=6, index=6]WeekDay - SUNDAY[name=星期日, val=0, index=7]************************************中文名称:星期五数字值:5自定义索引值:5顺序值:4枚举值名称:FRIDAY************************************两个枚举实例是否一致:true两个枚举值大小:-4
0 0