zoukankan      html  css  js  c++  java
  • Java中枚举的使用

    常量与枚举

    一、常量定义方法

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

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

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

    01./**

    02. * 星期

    03. * @author

    04. *

    05. */ 

    06.public class WeekDay {  

    07.    public static final int MONDAY = 1; // 星期一 

    08.    public static final int TUESDAY = 2; // 星期二 

    09.    public static final int WEDNESDAY = 3; // 星期三 

    10.    public static final int THURSDAY = 4; // 星期四 

    11.    public static final int FRIDAY = 5; // 星期五 

    12.    public static final int SATURDAY = 6; // 星期六 

    13.    public static final int SUNDAY = 0; // 星期日 

    14.} 

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

    二、枚举定义方法

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

    01./**

    02. * 星期枚举

    03. * @author

    04. *

    05. */ 

    06.public enum WeekDay { 

    07.    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY 

    08.} 

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

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

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

    01./**

    02. * 星期枚举

    03. * 

    04. * @author

    05. *

    06. */ 

    07.public enum WeekDay { 

    08.    // 利用构造方法传参 

    09.    MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(0); 

    10. 

    11.    private int val; 

    12. 

    13.    private WeekDay(int val) { 

    14.        this.val = val; 

    15.    } 

    16. 

    17.    @Override 

    18.    public String toString() { 

    19.        return String.valueOf(this.val); 

    20.    } 

    21.} 

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

        但需要注意的是,枚举类的构造方法与普通类的构造方法有很大的不同: ?枚举构造方法只在构造枚举值时被调用 ?枚举构造方法只能是private私有的,不能为public公有的

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

    01./**

    02. * 星期枚举

    03. * 

    04. * @author 

    05. *

    06. */ 

    07.public enum WeekDay {

    08.    // 利用构造方法传参 

    09.    MONDAY("星期一", 1, 1), TUESDAY("星期二", 2, 2), WEDNESDAY("星期三", 3, 3), THURSDAY( 

    10.            "星期四", 4, 4), FRIDAY("星期五", 5, 5), SATURDAY("星期六", 6, 6), SUNDAY( 

    11.            "星期日", 0, 7); 

    12. 

    13.    private String name; // 中文名称 

    14.    private int val; // 对应数字值 

    15.    private int index; // 索引 

    16. 

    17.    private WeekDay(String name, int val, int index) { 

    18.        this.name = name; 

    19.        this.val = val; 

    20.        this.index = index; 

    21.    } 

    22.

    23.    /**

    24.     * 获取中文名称

    25.     * 

    26.     * @return 中文名称字符串

    27.     */ 

    28.    public String getName() { 

    29.        return this.name; 

    30.    } 

    31. 

    32.    /**

    33.     * 获取枚举值对应数值

    34.     * 

    35.     * @return 枚举对应数值

    36.     */ 

    37.    public int getVal() { 

    38.        return this.val; 

    39.    } 

    40. 

    41.    /**

    42.     * 获取枚举值索引

    43.     * 

    44.     * @return 索引

    45.     */ 

    46.    public int getIndex() {

    47.        return this.index; 

    48.    } 

    49. 

    50.    /**

    51.     * 设置中文名称

    52.     * 

    53.     * @param name

    54.     *            中文名称

    55.     */ 

    56.    public void setName(String name) { 

    57.        this.name = name; 

    58.    } 

    59. 

    60.    /**

    61.     * 设置数字值

    62.     * 

    63.     * @param val

    64.     *            数值

    65.     */ 

    66.    public void setVal(int val) { 

    67.        this.val = val; 

    68.    } 

    69. 

    70.    /**

    71.     * 设置索引

    72.     * 

    73.     * @param index

    74.     *            索引

    75.     */ 

    76.    public void setIndex(int index) { 

    77.        this.index = index; 

    78.    } 

    79. 

    80.    /**

    81.     * 根据索引获取枚举值中文名称

    82.     * 

    83.     * @param index

    84.     *            索引

    85.     * @return 该索引枚举值中文名称

    86.     */ 

    87.    public static String getName(int index) { 

    88.        for (WeekDay weekDay : WeekDay.values()) {

    89.            if (weekDay.getIndex() == index) 

    90.                return weekDay.getName(); 

    91.        } 

    92. 

    93.        return null; 

    94.    } 

    95. 

    96.    @Override 

    97.    public String toString() { 

    98.        return "WeekDay " + super.toString() + "[name=" + this.name + " val=" 

    99.                + this.val + " index=" + this.index + "]"; 

    100.    } 

    101.} 

    关于使用枚举类型的说明

            所有枚举都继承了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;

    一个完整的示例:

    01.public class WeekDayTest {

    02. 

    03.    /**

    04.     * 定义枚举类型

    05.     */ 

    06.    public enum WeekDay { 

    07.        // 利用构造方法传参 

    08.        MONDAY("星期一", 1, 1), TUESDAY("星期二", 2, 2), WEDNESDAY("星期三", 3, 3), THURSDAY( 

    09.                "星期四", 4, 4), FRIDAY("星期五", 5, 5), SATURDAY("星期六", 6, 6), SUNDAY( 

    10.                "星期日", 0, 7); 

    11. 

    12.        private String name; // 中文名称 

    13.        private int val; // 对应数字值 

    14.        private int index; // 索引 

    15. 

    16.        private WeekDay(String name, int val, int index) { 

    17.            this.name = name; 

    18.            this.val = val; 

    19.            this.index = index; 

    20.        }

    21. 

    22.        /**

    23.         * 获取中文名称

    24.         * 

    25.         * @return 中文名称字符串

    26.         */ 

    27.        public String getName() { 

    28.            return this.name; 

    29.        } 

    30. 

    31.        /**

    32.         * 获取枚举值对应数值

    33.         * 

    34.         * @return 枚举对应数值

    35.         */ 

    36.        public int getVal() { 

    37.            return this.val; 

    38.        } 

    39. 

    40.        /**

    41.         * 获取枚举值索引

    42.         * 

    43.         * @return 索引

    44.         */ 

    45.        public int getIndex() { 

    46.            return this.index; 

    47.        } 

    48. 

    49.        /**

    50.         * 设置中文名称

    51.         * 

    52.         * @param name

    53.         *            中文名称

    54.         */ 

    55.        public void setName(String name) { 

    56.            this.name = name; 

    57.        } 

    58. 

    59.        /**

    60.         * 设置数字值

    61.         * 

    62.         * @param val

    63.         *            数值

    64.         */ 

    65.        public void setVal(int val) { 

    66.            this.val = val; 

    67.        } 

    68. 

    69.        /**

    70.         * 设置索引

    71.         * 

    72.         * @param index

    73.         *            索引

    74.         */ 

    75.        public void setIndex(int index) { 

    76.            this.index = index; 

    77.        } 

    78. 

    79.        /**

    80.         * 根据索引获取枚举值中文名称

    81.         * 

    82.         * @param index

    83.         *            索引

    84.         * @return 该索引枚举值中文名称

    85.         */ 

    86.        public static String getName(int index) { 

    87.            for (WeekDay weekDay : WeekDay.values()) { 

    88.                if (weekDay.getIndex() == index) 

    89.                    return weekDay.getName(); 

    90.            } 

    91. 

    92.            return null; 

    93.        } 

    94. 

    95.        @Override 

    96.        public String toString() { 

    97.            return "WeekDay - " + super.toString() + "[name=" + this.name 

    98.                    + ", val=" + this.val + ", index=" + this.index + "]"; 

    99.        } 

    100.    } 

    101. 

    102.    public static void main(String[] args) { 

    103.        // 遍历所有枚举值 

    104.        for (WeekDay weekDay : WeekDay.values()) { 

    105.            System.out.println(weekDay); 

    106.        }        

    107.        System.out.println("************************************"); 

    108.        // 将字符串“FRIDAY”转换为枚举类型 

    109.        WeekDay wd = WeekDay.valueOf("FRIDAY"); 

    110.        // 输出转换后星期的中文名称,数字值及自定义索引值,枚举值顺序值,枚举值名称 

    111.        System.out.println("中文名称:" + wd.getName()); 

    112.        System.out.println("数字值:" + wd.getVal()); 

    113.        System.out.println("自定义索引值:" + wd.getIndex()); 

    114.        System.out.println("顺序值:" + wd.ordinal()); 

    115.        System.out.println("枚举值名称:" + wd.name()); 

    116.        System.out.println("************************************"); 

    117.        // 比较两个枚举实例是否一致 

    118.        System.out.println("两个枚举实例是否一致:" + wd.equals(WeekDay.FRIDAY)); 

    119.        // 比较两个枚举值大小 

    120.        System.out.println("两个枚举值大小:" + WeekDay.MONDAY.compareTo(WeekDay.FRIDAY)); 

    121.    } 

    122.} 

              运行结果:

              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

  • 相关阅读:
    mysql启动报错:Another MySQL daemon already running with the same unix socket.
    DRBD编译安装中出现的问题及解决小结
    DRBD+Heartbeat+Mysql高可用环境部署
    LVS三种包转发模型调度算法
    nagios环境部署(rhel6.5)
    reorder-list
    二叉树的前序遍历(不用递归)
    最大正方形
    名字的漂亮度
    计算字符个数
  • 原文地址:https://www.cnblogs.com/lxh1197412986/p/4540658.html
Copyright © 2011-2022 走看看