再谈java枚举 ENUM

简介:

没有枚举之前:

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

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的方法,这个方法返回枚举值在枚举类种的顺序。

 

 

 


==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/11/27/2790402.html,如需转载请自行联系原作者
相关文章
|
23天前
|
Java API
Java基础—笔记—内部类、枚举、泛型篇
本文介绍了Java编程中的内部类、枚举和泛型概念。匿名内部类用于简化类的创建,常作为方法参数,其原理是生成一个隐含的子类。枚举用于表示有限的固定数量的值,常用于系统配置或switch语句中。泛型则用来在编译时增强类型安全性,接收特定数据类型,包括泛型类、泛型接口和泛型方法。
11 0
|
5月前
|
安全 Java 编译器
Java枚举(enum)
Java枚举(enum)
30 0
|
6月前
|
Java
Java枚举(Enum)的使用
Java枚举(Enum)的使用
52 0
|
Java 索引
Java中的枚举(enum)
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。 Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
177 0
Java之enum枚举
一.什么是枚举(enum) 1.枚举对应英文(enumeration,简写enum) 2.枚举是一组常量的集合,枚举对象名通常使用大写 3.枚举属于一种特殊的类,里面只包含一组有限的特定的对象
Java之enum枚举
|
Java
Java 枚举(enum)
Java 枚举(enum)
77 0
|
安全 Java 编译器
Java枚举(enum)常用的用法总结
Java枚举(enum)七种常见的用法汇总如下: JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。
333 0
Java枚举(enum)常用的用法总结
|
Java Spring 人工智能
Java基础枚举(enum关键字)
最近在回顾JavaSE部分的知识,对一些薄弱的知识进行记录,学习方式,通过视频和图书的进行学习,视频看B站韩顺平老师的30天学会Java,图书看Java核心技术 卷I 基础知识(原书第10版)。
Java基础枚举(enum关键字)
|
设计模式 缓存 安全
Java单例模式的7种写法中,为何用Enum枚举实现被认为是最好的方式?【享学Java】(上)
Java单例模式的7种写法中,为何用Enum枚举实现被认为是最好的方式?【享学Java】(上)
|
设计模式 安全 Java
Java单例模式的7种写法中,为何用Enum枚举实现被认为是最好的方式?【享学Java】(下)
Java单例模式的7种写法中,为何用Enum枚举实现被认为是最好的方式?【享学Java】(下)