[From] http://www.cnblogs.com/rollenholt/archive/2012/11/27/2790402.html

没有枚举之前:

  在没有枚举之前,我们想列举一些相关的常量,我们会采用如下的方式:

1
2
3
4
interface ActionInterface
{
    public static final int RIGHT
0;
    public static final int LEFT
1;
}

  然后在某个类似于下面的方法中,使用这些常量:

1
2
3
4
5
6
7
8
9
10
11
12
public void playWithInterface(int num)
{
    switch (num)
{
    case ActionInterface.RIGHT:
        System.out.println("RIGHT");
        break;
    case ActionInterface.LEFT:
        System.out.println("LEFT");
        break;
    default:
        System.out.println("Default");
    }
}

  不知道你注意了没,在这样做的时候,请记住这类常量是 Java 中 int 类型的常量,这意味着该方法可以接受任何 int 类型的值,即使它和之前的接口中定的所有常量都不对应。因此,您需要检测上界和下界,在出现无效值的时候,你只能依赖switch中的default或者其他的处理手段,而且,如果后来又添加另外一个常量的时候,那么你就必须改变很多相关联代码中的上界,下界处理程序,才能接受这个新值。

有了枚举之后:

  你应该对于这种情况,总是使用枚举,比如:

1
2
3
enum ActionEnum{
    RIGHT,LEFT
}

  然后在某个类似于下面的方法中,使用它们:

1
2
3
4
5
6
7
8
9
10
11
12
public void playWithEnum(ActionEnum
actionEnum) {
    switch (actionEnum)
{
    case RIGHT:
        System.out.println("RIGHT");
        break;
    case LEFT:
        System.out.println("LEFT");
        break;
    default:
        System.out.println("Default");
    }
}

  这样,你就不必费很大的心思去检查之前的一些问题,而且即便需求修改之后,添加了一些相关的变量,你只需要修改ActionEnum就行,其余代码都不需要修改。

  需要注意的是,在上面的switch中,我们使用的是case RIGHT... 而不是case ActionEnum.RIGHT(这样会出错),原因是枚举重写了ToString(),也就是说枚举变量的值是不带前缀的。

上面所说的,可能并不能完全显示出枚举类型的优势,但是确实我们经常采用的形式。下面我们来尽可能的认识一下枚举:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.java;
 
public class EnumDemo
{
    /**
     *
最简单的枚举示例
     *
*/
    public enum SimpleEnum
{
        UP,
DOWN
    }
     
    /**
     *
带有属性和方法的枚举示例
     *
注意:枚举本身也是类,可以象一般的类一样为它添加静态或者非静态的属性或方法
     *       
但是枚举列表必须写在最前面,否则编译出错。比如本例中的UP,DOWN
     *
*/
    public enum EnumWithFuncAndAttr
{
        UP,
DOWN;
        private static final String
description = 
"这个是一个有方法和属性的枚举示例";
 
        public String
getDescription() {
            return description;
        }
    }
     
    /**
     *
带有构造函数的枚举示例
     *
注意:枚举可以有构造方法,通过括号赋值。如果不赋值,那么就不能编写构造方法,否则出错。
     *
构造方法只能是private的或者默认的。而不能是public以及protected,否则出错。这样做可以保证客户代码没有办法新建一个enum的实例
     *
*/
    public enum EnumWithConstructor{
        UP("hello"),DOWN("java");
        private final String
value;
        String
getValue(){
            return value;
        }
        EnumWithConstructor(String
value){
            this.value=value;
        }
    }
     
    public static void main(String[]
args) {
        System.out.println(SimpleEnum.values().length);
        System.out.println(SimpleEnum.UP);
        System.out.println(SimpleEnum.valueOf("UP"));
        for (EnumWithConstructor
item : EnumWithConstructor.values()) {
            System.out.println(item+"
"
+item.getValue());
        }
        System.out.println(SimpleEnum.UP.ordinal());
    }
}

  总结:

  1.枚举本身就是一个类。

  2.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。

  3..所有枚举值都是public static final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。

  4.Enum默认实现了java.lang.Comparable接口。

  5.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.

  6.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一般来说应该相对应地重写valueOf方法。

  7.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值

  8.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序。

再谈java枚举 ENUM的更多相关文章

  1. Java 枚举(enum) 详解7种常见的用法

    Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...

  2. 沉淀再出发:再谈java的多线程机制

    沉淀再出发:再谈java的多线程机制 一.前言 自从我们学习了操作系统之后,对于其中的线程和进程就有了非常深刻的理解,但是,我们可能在C,C++语言之中尝试过这些机制,并且做过相应的实验,但是对于ja ...

  3. 【JAVA】浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  4. JAVA—枚举(Enum)学习总结

    1.枚举(Enumeration) 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式.这种传统接口已被迭代器取代,虽然Enumeration 还未被遗弃,但在现代代码 ...

  5. Java 枚举(enum) 的常见用法和开发规范

    JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static final ...

  6. 浅谈java枚举类

    一.什么情况下使用枚举类? 有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便? 二.为什么不用静态常量来替代枚举类呢? public static final int SEASO ...

  7. Java 枚举 enum 详解

    本文部分摘自 On Java 8 枚举类型 Java5 中添加了一个 enum 关键字,通过 enum 关键字,我们可以将一组拥有具名的值的有限集合创建为一种新的类型,这些具名的值可以作为常规的程序组 ...

  8. java枚举(enum)

    1. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum (抽象类) 类的子类. enum AccountType { SAVING, FIXED, CURRE ...

  9. Java 枚举(enum) 详解4种常见的用法

    JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 大师兄我又加上自己的理解,来帮助各位理解一下. 用法一:常量 在JDK1.5 之前,我们定义常 ...

随机推荐

  1. jQuery基础教程-第8章-002Adding jQuery object methods

    一.Object method context 1.We have seen that adding global functions requires extending the jQuery ob ...

  2. 39.FORMAT() 函数

    FORMAT() 函数 FORMAT 函数用于对字段的显示进行格式化. SQL FORMAT() 语法 SELECT FORMAT(column_name,format) FROM table_nam ...

  3. 第十三课 Actionlib(2)

    上节课讲到了客户端,这节课讲解一下服务器 1.创建服务器源文件touch fibonacciserver.cpp 2.编写源文件 3.修改CMakeLists.txt 4.编译之catkin_make ...

  4. docker入门及安装

    Docker简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).ba ...

  5. Requests接口测试(五)

    使用python+requests编写接口测试用例 好了,有了前几章的的基础,写下来我把前面的基础整合一下,来一个实际的接口测试练习吧. 接口测试流程 1.拿到接口的URL地址 2.查看接口是用什么方 ...

  6. Python基础入门-For循环

    For循环的功能比较强大,他可以帮助我们实现很多重复性的工作.而且for循环能迭代不同的数据结构.他的应用也十分的广泛,作为初学者,我们需要对循环的概念多加理解和练习.接下来我们就来学习for循环的一 ...

  7. python3安装 feedparser

    在看<集体智慧编程>时碰到python3环境下安装feedparser的问题,搜索发现很多人碰到此问题,最终找以下方法解决. how to install feedparser on py ...

  8. location.replace() keeps the history under control

    from https://dev.opera.com/articles/efficient-javascript Occasionally, it is necessary to change the ...

  9. .Net 数据库(SqlServer2008)的备份、还原

    //备份代码private void Backup() { SqlConnection sqlConn = new SqlConnection(strConn); strFileName = &quo ...

  10. git手动解决内容冲突

    <span style="font-size:18px;">git checkout -b lab4 origin/lab4 git merge lab3</sp ...