今天总结一下枚举相关的知识.先附一段关于枚举的代码:
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将根据枚举的顺序来维护对象的排列书序.