[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. Linux下DNS配置

    一.本机DNS配置 参考:http://blog.sina.com.cn/s/blog_68d6e9550100k3b7.html 二.DNS服务器搭建 http://toutiao.com/i631 ...

  2. 利用HttpWebRequest类Post数据至URI

    在与第三方系统进行数据对接时,需要把数据post到对方提供的一个url,然后进行相关处理. 这里可利用HttpWebRequest类,该类位于System.Net命名空间下.它提供了一些属性和方法可以 ...

  3. linux(2)

  4. LinkedHashMap原理以及场景

    http://www.cnblogs.com/xiaoxi/p/6170590.html

  5. qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用(转)

    原则上,两者是不可以同时存在的,但是如果都安装了,该如何分别使用他们呢? Qt4 Visual Studio Add-in:官网可以下载安装程序,qt-vs-addin-1.1.11-opensour ...

  6. [转] MySQL索引原理

    MySQL索引原理 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉 ...

  7. 数值限制------c++程序设计原理与实践(进阶篇)

    每种c++的实现都在<limits>.<climits>.<limits.h>和<float.h>中指明了内置类型的属性,因此程序员可以利用这些属性来检 ...

  8. WebJars——web端静态资源的jar包

    1.WebJars介绍 Web前端使用了越来越多的JS或CSS,如jQuery,Backbone.js和Bootstrap.一般情况下,我们是将这些Web资源拷贝到Java Web项目的webapp相 ...

  9. 基于Haar特征的Adaboost级联人脸检测分类器

    基于Haar特征的Adaboost级联人脸检测分类器基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器.通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征 ...

  10. 80端口被system(pid=4)占用

    1.查看80端口被哪个进程占用,cmd->netstat -ano | findstr 80 2.cmd->tasklist列出当前运行中的进程,或在任务管理器中查看pid为4的进程. 经 ...