今天总结一下枚举相关的知识.先附一段关于枚举的代码:

 package org.talend.core.model.param;

 import org.talend.core.i18n.Messages;

 /**
  * qzhang class global comment. Detailled comment <br/>
  *
  */
 public enum EConnectionParameterName {
     SERVER_NAME(Messages.getString("ConnectionParameterName.HostLabel")), //$NON-NLS-1$
     PORT(Messages.getString("ConnectionParameterName.PortLabel")), //$NON-NLS-1$
     SID(Messages.getString("ConnectionParameterName.DatabaseLabel")), //$NON-NLS-1$
     SCHEMA(Messages.getString("ConnectionParameterName.SchemaLabel")), //$NON-NLS-1$
     USERNAME(Messages.getString("ConnectionParameterName.UserLabel")), //$NON-NLS-1$
     PASSWORD(Messages.getString("ConnectionParameterName.PasswordLabel")), //$NON-NLS-1$
     FILE(Messages.getString("ConnectionParameterName.DbfileLabel")), //$NON-NLS-1$
     DIRECTORY(Messages.getString("ConnectionParameterName.DbPathLabel")), //$NON-NLS-1$
     PROPERTIES_STRING("Additional JDBC Parameters"), //$NON-NLS-1$
     DATASOURCE("DataSource"), //$NON-NLS-1$
     DRIVER_JAR("Driver jar"), //$NON-NLS-1$
     DRIVER_CLASS("Driver class"), //$NON-NLS-1$
     LOCAL_SERVICE_NAME("Local Service Name"),
     URL("Url"), //$NON-NLS-1$
     HTTPS("https"), //$NON-NLS-1$
     DBPATH("DBPATH");//$NON-NLS-1$

     private String displayName;

     /**
      * qzhang ConnectionParameterName constructor comment.
      */
     EConnectionParameterName(String displayName) {
         this.displayName = displayName;
     }

     public String getName() {
         return this.toString();
     }

     public String getDisplayName() {
         return this.displayName;
     }
 }

枚举是JDK1.5加入的一个全新类型的"类"----枚举类型.为此JDK1.5引入了一个新关键字enum.

我们可以这样来定义一个枚举类型

Color.java

public enum Color{
    Red, White, Blue, Black
}

然后可以这样来使用Color myColor = Color.Red.

枚举类型还提供了两个有用的静态方法values()和valueOf().我们可以很方便的使用它们.

例如:

ColorTest.java

 public class ColorTest{
     public static void main(String[] args){
         Color myColor = Color.Blue;

         System.out.println(myColor);

         System.out.println("----------------");

         for(Color color : Color.values()){
             //Color.values()返回的是一个枚举值(Color)类型的的数组
             System.out.println(color);
         }
     }
 }

打印出的结果就是:

Blue
----------------
Red
White
Blue
Black

下一个例子:(把枚举作为方法的参数)

EnumTest.java

 public class EnumTest{
     public static void doOp(OpConstant opConstant){
         switch (opConstant){
         //switch后面可以跟哪几种数据类型?
         //char,byte,shor,int 还有一个就是枚举类型,不能跟long和String
             case TURN_LEFT:
                 System.out.println("向左转");
                 break;

             case TURN_RIGHT:
                 System.out.println("向右转ת");
                 break;

             case SHOOT:
                 System.out.println("设计");
                 break;
         }
     }

     public static void main(String[] args){
         doOp(OpConstant.TURN_LEFT);
     }
 }

 enum OpConstant{
     TURN_LEFT, TURN_RIGHT, SHOOT
 }

打印:向左转

定义枚举类型时本质上就是在定义一个类别,只不过很多细节由编译器帮你完成了,,所以某些程度上,enum关键字的作用就像是class或者interface.

当你使用"enum"定义枚举类型时,实质上你定义出来的类型继承自java.lang.Eunm类,而每个枚举的成员其实就是你定义的枚举类型的一个实例(Instance)(换句话说,当定义了一个枚举类型之后,在编译时刻就能确定该枚举类型又几个实例,,分别是什么.在运行期间我们无法再使用该枚举类型创建新的实例了,这些实例在编译期间就已经完全确定下来了),他们都被预先设为final,所以你无法改变他们,他们也是static成员,所以你可以通过类型名称直接使用他们,当然最重要的他们都是公开的(public).

枚举中"成员"都是public static final类型的.

这里把上面的Color.java的反编译后的代码附上:

Color.java

 // Decompiled by DJ v2.9.9.61 Copyright 2000 Atanas Neshkov  Date: 2015/1/11 16:26:11
 // Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
 // Decompiler options: packimports(3)
 // Source File Name:   Color.java

 package cn.shengsiyuan.jdk5;

 public final class Color extends Enum
 {

     private Color(String s, int i)
     {
         super(s, i);
     }

     public static Color[] values()
     {
         Color acolor[];
         int i;
         Color acolor1[];
         System.arraycopy(acolor = ENUM$VALUES, 0, acolor1 = new Color[i = acolor.length], 0, i);
         return acolor1;
     }

     public static Color valueOf(String s)
     {
         return (Color)Enum.valueOf(cn/shengsiyuan/jdk5/Color, s);
     }

     public static final Color Red;
     public static final Color White;
     public static final Color Blue;
     public static final Color Black;
     private static final Color ENUM$VALUES[];

     static
     {
         Red = new Color("Red", 0);//数字0是枚举的一个索引
         White = new Color("White", 1);
         Blue = new Color("Blue", 2);
         Black = new Color("Black", 3);
         ENUM$VALUES = (new Color[] {
             Red, White, Blue, Black
         });
     }
 }

valueOf()方法会将一个字符串变成一个枚举.

枚举和普通的类最特别的地方就在于:

枚举这些类型在编译的时候就已经确定好了,没有办法再去生成新的对象了,而类只要去new就能生成新的对象.

不管是枚举还是类在构造的时候都需要去调用构造方法,这一点是一样的,.因此构造方法要传什么样的参数,枚举也要传入什么样的参数.

第三个例子:

Coin.java

 public enum Coin{
     penny("hello"), nickel("world"), dime("welcome"), quarter("hello world");
     private String value;

     public String getValue(){
         return value;
     }

     //这个是枚举的构造方法
     //所以在上面用的是带括号中带参数的枚举类型penny("hello").
     Coin(String value){
         this.value = value;
     }

     public static void main(String[] args){
         Coin coin = Coin.quarter;
         //因为枚举的对象是public static final类型的所以可以这样直接调用其生成的对象.
         System.out.println(coin.getValue());
     }
 }

以上就是枚举中的一些概念,剩下的就是枚举中的集合等API的使用.

showEnum.java

 public class ShowEnum{
     public static void main(String[] args){
         enumCompareTo(OpConstant.valueOf(args[0]));
     }

     public static void enumCompareTo(OpConstant constant){
         System.out.println(constant);

         for(OpConstant c : OpConstant.values()){
             System.out.println(constant.compareTo(c));
         }
     }
 }
 enum OpConstant{
     TURN_LEFT, TURN_RIGHT, SHOOT
 }

如果直接运行这个程序的话会报错的.这是我第一次看到可以这样运行程序.......见下图.....

报错:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at cn.shengsiyuan.jdk5.ShowEnum.main(ShowEnum.java:5)

然后在进行如下设置:

运行结果是:

SHOOT
2
1
0

showEnum2.java

 public class ShowEnum2{
     public static void main(String[] args){
         for(OpConstant c : OpConstant.values()){
             System.out.printf("%d, %s, %n", c.ordinal(), c);
             //jdk5.0之后java中增加了一个类似于C语言的带格式化的方法printf().方法中可以设置格式.
             //public final int ordinal()
             //返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
             //大多数程序员不会使用此方法。它被设计用于复杂的基于枚举的数据结构,比如 EnumSet 和 EnumMap。
             //就表示枚举第一个是0,第二个是1,第三个是2.
         }
     }
 }

关于枚举的集合:

EnumSet的名称说明了其作用,它是在Java5.0之后加入的新类别,可以协助你建立枚举值的集合,它提供了一系列的静态方法,可以让你指定不同的集合建立方式.

EnumSetDemo.java

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>未完待续.......还有三个java文件没有总结>>>>>

EnumMap是个专为枚举类型设计的类别.方便你使用枚举类型以及Map对象.

与单纯的使用HashMap比较起来的差别是在上面的程序中,EnumMap将根据枚举的顺序来维护对象的排列书序.

[未完成]关于枚举(Enum)的更多相关文章

  1. MySQL字段之集合(set)枚举(enum)

    MySQL字段之集合(set)枚举(enum) (2008-12-23 13:51:23) 标签:it  分类:MySQL 集合 SET mysql> create table jihe(f1 ...

  2. 枚举 enum

    typedef enum : NSUInteger { <#MyEnumValueA#>, <#MyEnumValueB#>, <#MyEnumValueC#>, ...

  3. 枚举enum学习小记

    参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社 ...

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

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

  5. Python 枚举 enum

    Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...

  6. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  7. 枚举Enum和常量0之间的恩怨

    1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...

  8. C++和Java中枚举enum的用法

    在C++和java中都有枚举enum这个关键字,但是它们之间又不太一样.对于C++来说,枚举是一系列命名了的整型常量,而且从枚举值转化为对应的整型值是在内部进行的.而对于Java来说,枚举更像一个类的 ...

  9. 【转】枚举enum学习小记

    原帖: http://hi.baidu.com/yuleishou/item/caacae872190031ec216272f 表示在vs2008下实验了一下,有些东西和原帖的还是不一样的,都贴在这里 ...

随机推荐

  1. win7远程链接ubuntu 桌面版

    1.安装ubuntu 使用vagrant 添加了一个ubuntu12.04(xmanager好像只能控制最高这个版本,14.04没成功过) 2.安装xmanager 4 3.修改ubutu配置文件 s ...

  2. Ubuntu 小技巧

    一.获得当前文件夹的路径: 在目标文件夹下,按Ctrl+l此文件的路径会被选中 之后Ctrl+c复制.要复制到终端(Terminal),选中终端按鼠标的滚轮就粘贴到了Terminal命令行中了. 二. ...

  3. 【tyvj1952】easy

    AK大神又AK了!!! orzorzorz 题意: 给出一个字符串由'x'.'o'.'?' '?'有一半的几率为'x' 一半几率为'o' 得分为所有连续的'o'的个数的平方和 如ooxooo 得分为2 ...

  4. C# Asp.net中的AOP框架 Microsoft.CCI, Mono.Cecil, Typemock Open-AOP API, PostSharp -摘自网络 (可以利用反射 Attribute 进行面向切面编程 可以用在记录整个方法的Log方面)

    Both Microsoft.CCI and Mono.Cecil are low-level, and don't validate produced assemblies. It takes lo ...

  5. c语言中格式化输出函数的研究

    <一>; 1.前言 在gcc编程中,我们比较经常用到的字符格式化输出函数是printf的,实际上gcc继承了c语言处理字符具有强大功能的风格,它提供了一系列的格式化输出函数,主要存在两个库 ...

  6. 创建本地CM 离线服务器

    一.包管理工具及CentOS的yum 1.包管理工具如何发现可以用的包 包管理工具依赖一系列软件源,工具下载源的信息存储在配置文件中,其位置随某包管理工具不同而变化 使用yum的RedHat/Cent ...

  7. POJ3666-Making the Grade(左偏树 or DP)

    左偏树 炒鸡棒的论文<左偏树的特点及其应用> 虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱…… 虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大 ...

  8. android事件分发笔记

    1.SimpleOnGestureListener 遇到的问题: 自己定义一个按钮继承自Button,一开始改变按钮颜色的操作放在onTouchEvent的ATION_DOWN里触发. 这时问题来了, ...

  9. quartus II 自动生成testbench

    如果自己不想写这些testbench的这些固定格式,可以在quartus里自动生成testbench文件的模板,然后往里面写信号就行了 步骤:processing->start->star ...

  10. Oracle- 查询误删数据

    使用flashback table能恢复误删数据. flashback table CONTAINER_CONTENT to timestamp to_timestamp('2010-06-30 22 ...