[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. Entity Framework 6.0 Tutorials(11):Download Sample Project

    Download Sample Project: Download a sample project for Entity Framework 6 Database-First model below ...

  2. javascript总结2: Date对象

    1 Date 对象 Date 对象用于处理日期与时间. Date()的方法很多,这里只总结工作必备的方法! 2 常用方法 创建个 Date 对象:const mydate=new Date(); &l ...

  3. GCC 4.7相对4.6.x的改进点

    原文:http://www.iteye.com/news/24628针对C的功能改进: 支持ISO C11标准中的更多特性.除了之前的-std=c1x和-std=gnu1x选项外,GCC现在还支持-s ...

  4. RPLiDAR 激光雷达探测地面高程

    LiDAR,又称激光探测与测量,全程Light Detection And Ranging,这种技术使用激光测量地物(如森林和建筑物)的高程.它的原理十分类似于使用声波来测绘海底地形的声呐技术,或使用 ...

  5. 【转】MOCK方法介绍

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://baidutech.blog.51cto.com/4114344/743740 1 ...

  6. [Violet]樱花

    题目链接 洛谷 狗粮版 前置技能 初中基础的因式分解 线性筛 \(O(nlog)\)的分解质因数 唯一分解定理 题解 首先来分解一下式子 \[\frac{1}{x}+\frac{1}{y}=\frac ...

  7. Markdown使用样例

    # 欢迎使用 Cmd - 在线 Markdown 编辑阅读器 ------ 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,**Cmd Markdown** 是 ...

  8. loj#6436. 「PKUSC2018」神仙的游戏(NTT)

    题面 传送门 题解 一旦字符串踏上了通配符的不归路,它就永远脱离了温暖的字符串大家庭的怀抱 用人话说就是和通配符扯上关系的字符串就不是个正常的字符串了比如说这个 让我们仔细想想,如果一个长度为\(le ...

  9. 图层锁定vlisp函数高版本图元自动淡色显示

    (defun c:tt(/ obj) (sk_layerLock (getvar "clayer") nil) (princ) ) ;;;name:sk_layerLock ;;; ...

  10. Python数据结构,计算问题

    2018-08-12   <Python 算法>以及<用Python解决数据结构和算法> 什么是算法? 在计算机的世界中,算法本质上是我们对某一个问题或则某一类问题的解决方案. ...