[未完成]关于枚举(Enum)
今天总结一下枚举相关的知识.先附一段关于枚举的代码:
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)的更多相关文章
- MySQL字段之集合(set)枚举(enum)
MySQL字段之集合(set)枚举(enum) (2008-12-23 13:51:23) 标签:it 分类:MySQL 集合 SET mysql> create table jihe(f1 ...
- 枚举 enum
typedef enum : NSUInteger { <#MyEnumValueA#>, <#MyEnumValueB#>, <#MyEnumValueC#>, ...
- 枚举enum学习小记
参考文献: [1]C++程序设计语言(特别版), 裘宗燕译, 机械工业出版社 [2]C++ Primer (3rd Ed.), S.B. Lippman and J. Lajoie, 人民邮电出版社 ...
- Java 枚举(enum) 详解7种常见的用法
Java 枚举(enum) 详解7种常见的用法 来源 https://blog.csdn.net/qq_27093465/article/details/52180865 JDK1.5引入了新的类型— ...
- Python 枚举 enum
Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...
- 【转】结构struct 联合Union和枚举Enum的细节讨论
结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...
- 枚举Enum和常量0之间的恩怨
1,任何为0的常量表达式都能隐式的转换成枚举Enum. 对于这一点,在程序中没少吃苦头.特别是对于函数重载的情况,往往让人一头雾水. 看看下面的代码(摘自MSDN),你能猜到输出吗? public e ...
- C++和Java中枚举enum的用法
在C++和java中都有枚举enum这个关键字,但是它们之间又不太一样.对于C++来说,枚举是一系列命名了的整型常量,而且从枚举值转化为对应的整型值是在内部进行的.而对于Java来说,枚举更像一个类的 ...
- 【转】枚举enum学习小记
原帖: http://hi.baidu.com/yuleishou/item/caacae872190031ec216272f 表示在vs2008下实验了一下,有些东西和原帖的还是不一样的,都贴在这里 ...
随机推荐
- DNS(三)DNS SEC(域名系统安全扩展)
工作需要今天了解了下DNS SEC,现把相关内容整理如下: 一.DNS SEC 简介 域名系统安全扩展(英语:Domain Name System Security Extensions,缩写为DNS ...
- theano学习指南5(翻译)- 降噪自动编码器
降噪自动编码器是经典的自动编码器的一种扩展,它最初被当作深度网络的一个模块使用 [Vincent08].这篇指南中,我们首先也简单的讨论一下自动编码器. 自动编码器 文献[Bengio09] 给出了自 ...
- 简易博客编辑器:玩转document.execCommand命令
xhEditor是基于jQuery开发的跨平台轻量可视化XHTML编辑器,基于LGPL开源协议发布.今天就把它山寨一下. 上几张图,看看效果: 先做出菜单部分:发现是一张背景图片,所以用图片映射的方法 ...
- mysql日期格式说明符
- HDU4276 - The Ghost Blows Light(树形DP)
题目大意 给定一棵n个结点的树,每个结点上有一定数量的treasure,经过每条边需要花一定的时间,要求你从结点1出发,在不超过时间T的情况下,最多能够获得的treasure是多少,并且要求结束于结点 ...
- ffmpeg 的tutorial
可能是新的: https://github.com/chelyaev/ffmpeg-tutorial https://github.com/chelyaev/ffmpeg-tutorial.git 老 ...
- 关于 Java 对象序列化您不知道的 5 件事
数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...
- Java 多线程同步的五种方法
一.引言 闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子 ...
- support-v4不能查看源码
在Android实际开发过程中往往会遇到使用v4,v7或v13兼容包中的一些类如ViewPager,Fargment等,但却无法关联源码 具体步骤: 1 右击Android项目中libs文件夹下的an ...
- 【P3O是什么】P3O认证之项目组合、项目群和项目办公室
如何区分项目组合办公室与项目群和项目办公室? P3O®(Portfolio,Programmed and Project Offices-项目组合.项目群和项目办公室)是由英国商务部 OGC 于200 ...