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

 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. jQuery轻量级京东图片轮播代码等

    http://sc.chinaz.com/jiaoben/jiaodiantu.html jQuery轻量级京东图片轮播代码   查看全图点击预览 顶(17)踩(4)报错评论(0)下载地址 更新时间: ...

  2. 【原】Redis分区

    Redis高级篇 分区 为什么分区? Redis中的分区主要有两个目的: 允许用多台机器的内存存放更大的数据集.如果没有分区,那么你只能存放单台机器内存的最大值的数据集. 允许用多核和多台机器提高计算 ...

  3. CDH ecosystem components

    1,Mahout ASF(Apache Software Foundation)开源项目,提供可扩展的`机器学习`--(ML,Machine Learning多领域交叉学科,涉及概率,统计,逼近,凸分 ...

  4. Visual Studio 2008 – ASP.NET “System.Runtime.InteropServices.COMException”

    The Issue When openning an existing ASP.NET project for the first time in Visual Studio 2008 it retu ...

  5. oracle 修改索引现有表空间

    工作日记之<修改索引现有表空间> //dba_indexes可查询所有索引,以及索引部分信息,可以灵活运用于其他用途 //假设用户USER1现有表空间TS1.TS2,需要迁移其下所有表空间 ...

  6. ecshop如何去除后台左侧云服务中心菜单

    介绍一下如何去除后台云服务中心菜单: 打开admin/templates/menu.htm,把539行的 document.getElementById("menu-ul").in ...

  7. ecshop后台admin文件夹任意更改名

    为了ecshop网站安全起见或不想泄露后台的路径,那么我们必须修改后台admin文件夹名称. 方法和步骤如下: 把原admin文件夹名改成edait为例来说明 首先,把商城根目录下的admin文件夹重 ...

  8. 利用putty软件连接虚拟机中linux操作系统

    http://jingyan.baidu.com/article/9c69d48fbefe6613c8024e6a.html 大家在使用虚拟的过程中有时候会感觉切换操作系统很不方便,那么有什么方法可以 ...

  9. 实例:ABAP Tree Control 使用与ALV Grid对象关联

    Tree Control 是最常用的Windows控件之一,在其他语言中成为"Tree View"等,ABAP的 Tree Contiol 能实现类似的功能. 本文主要介绍一下内容 ...

  10. 逻辑网络(Logical Network)

    Introduction The VMM documentation indicates that “A logical network is used to organize and simplif ...