枚举通过enum关键字进行定义。实际上当定义一个枚举类型的时候,该类型默认继承了Enum类。

枚举的定义格式如下:

enum Color
{
RED,BLUE,GREEN;
}

下面演示一个枚举变量的声明和输出:

 public static void main(String[] args)  throws Exception
{
Color c = Color.RED;
System.out.println(c);
}

当我们要遍历所有的枚举类型时,可以先将其转换为一个数组,然后用foreach语法进行输出。

 public static void main(String[] args)  throws Exception
{
Color[] colors = Color.values();
for(Color color : colors)
{
System.out.println(color);
}
}

Enum类的构造函数如下:

 Enum(String name, int ordinal)

因为所有的枚举类型都默认继承Enum,所以上面的代码实际上默认调用了该构造函数。name的值就是RED,BLUE或GREEN,而ordinal的值从0开始。所以,下面的代码演示了每个枚举变量的name和ordinal值。

 public static void main(String[] args)  throws Exception
{
Color[] colors = Color.values();
for(Color color : colors)
{
System.out.println(color.ordinal() + ":" + color.name());
}
}

输出结果为:

0:RED

1:BLUE

2:GREEN

我们在定义枚举类的时候,也可以定义构造函数。因为枚举类的实例必须是有限的个数(本文中Color中只有3种颜色),所以,构造函数必须私有化。

 enum Color
{
RED("红色"),BLUE("蓝色"),GREEN("绿色"); private String alias;
private Color(String alias)
{
this.alias = alias;
}
public String getAlias()
{
return this.alias ;
} }

因为定义了带参数的构造函数,所以在实例化枚举实例的时候,必须传入参数。

此时用下面的代码测试:

 public static void main(String[] args)  throws Exception
{
Color[] colors = Color.values();
for(Color color : colors)
{
System.out.println(color.ordinal() + ":" + color.name() + "("+color.getAlias()+")");
}
}

利用上面的特性,我们可以设计一个表示状态的枚举。如我们想定义一个会员状态的枚举类,会员状态有:待激活(0)、已激活(1)、锁定(-1)这三种状态。我们已经知道了,枚举变量有ordinal()方法可以提取该枚举变量的序号,然而这个数值只是代表该枚举序号,从0开始,显然无法表示-1,0,1这三种状态。这里可以借助构造方法来实现我们的需求:

 enum MemberState
{
LOCKED(-1),READY(0),ACTIVED(1); private Integer code ; private MemberState(Integer code)
{
this.code = code;
} public Integer getCode()
{
return this.code;
}
}

测试代码:

 public class Main
{
public static void main(String[] args)
{
for(MemberState item : MemberState.values())
{
System.out.println("序号:"+item.ordinal());
System.out.println("状态:"+item.name());
System.out.println("代码:"+item.getCode());
System.out.println("----------");
}
System.out.println("Main Done//~~");
}
}

输出结果:

序号:0
状态:LOCKED
代码:-1
----------
序号:1
状态:READY
代码:0
----------
序号:2
状态:ACTIVED
代码:1
----------
Main Done//~~

因为Enum实现了Comparable接口,所以可以对枚举类型排序:

 public static void main(String[] args)  throws Exception
{
Set<Color> colorSet = new TreeSet<Color>();
colorSet.add(Color.BLUE);
colorSet.add(Color.GREEN);
colorSet.add(Color.RED);
for(Color color : colorSet)
{
System.out.println(color.ordinal() + ":" + color.name() + "("+color.getAlias()+")");
}
}

输出结果:

0:RED(红色)

1:BLUE(蓝色)

2:GREEN(绿色)

我们也可以将一个字符串解析为枚举类型:

 public static void main(String[] args)  throws Exception
{
Color cRed = Color.valueOf("RED");
Color cBlue = Color.valueOf("BLUE");
System.out.println(cRed.ordinal() + ":" + cRed.name() + "("+cRed.getAlias()+")");
System.out.println(cBlue.ordinal() + ":" + cBlue.name() + "("+cBlue.getAlias()+")");
}

输出结果:

0:RED(红色)

1:BLUE(蓝色)

Java中的枚举的更多相关文章

  1. 【译】Java中的枚举

    前言 译文链接:http://www.programcreek.com/2014/01/java-enum-examples/ Java中的枚举跟其它普通类很像,在其内部包含了一堆预先定义好的对象集合 ...

  2. Java中的枚举类型详解

    枚举类型介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义 ...

  3. 扒一扒: Java 中的枚举

    目录 1. 枚举的定义 1.1 传统的非枚举方法 1.2 枚举方法 1.3 定义总结 2 枚举的本质 2.1 继承 java.lang.Enum 2.2 final 类型 2.3 枚举常量本身就是该类 ...

  4. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

  5. 用好Java中的枚举真的没有那么简单

    1.概览 在本文中,我们将看到什么是 Java 枚举,它们解决了哪些问题以及如何在实践中使用 Java 枚举实现一些设计模式. enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继承j ...

  6. JAVA中的枚举小结

    枚举 将一组有限集合创建为一种新的类型,集合里面的值可以作为程序组件使用: 枚举基本特性 以下代码是枚举的简单使用: 使用values方法返回enum实例的数组 使用ordinal方法返回每个enum ...

  7. 说说Java中的枚举(一)

    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. ...

  8. Android笔记:java 中的枚举

    部分数据使用枚举比较方便,java中的enmu不如c#中使用方便 记录备忘 以c#中的代码为例 public enum PlayState { /// <summary> /// 关闭 / ...

  9. Java中Enum枚举的使用

    三种不同的用法 注意项: 1.在switch中使用枚举能使代码的可读性更强.   2.如果要自定义方法,那么必须在enum实例序列的最后添加分号.而且Java要求必须先定义enum实例.   3.所有 ...

  10. Java中的枚举的治理

    版权声明:本文为博主原创文章,转载请注明出处,欢迎使劲喷 一.为啥用枚举&为啥要对枚举进行治理 1.先来说说为啥用枚举 表中某个字段标识了这条记录的状态,我们往往使用一些code值来标识,例如 ...

随机推荐

  1. iOS开发Swift篇—(六)流程控制

    iOS开发Swift篇—(六)流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注意:这 ...

  2. 搭建web服务器环境

    一. 安装apache 安装好之后测试:浏览器地址栏输入:localhost,若弹出"It works!"表明已成功安装. 管理方式:1.通过Apache自带的镜像管理器:2.wi ...

  3. oracle生成行方法

    数据库记录是行的集合 set of row, 那么如何如何生成集合呢? oracle中常用的是 递归查询(with ... union all ...) 以及 connect by(树形查询) htt ...

  4. candence 知识积累4

    一.PCB布局约束: 1.尺寸规划:PCB大小要合适,PCB太大印制线路长,阻抗增加.太小散热不好,易受干扰. 2.PCB尺寸确定后要确定特殊器件的位置. 3.尽可能缩短高频元器件之间的连线,设法减少 ...

  5. 如何重新安装DEDECMS织梦系统

    重装的方法: 1.找到安装目录\install\index.php.bak文件,改名为index.php:   2.删除安装目录\install\install_lock文件:

  6. JVM-程序编译与代码晚期(运行期)优化

    晚期(运行期)优化 1.为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time,JI ...

  7. Jmeter—7 测试中使用到的定时器和逻辑控制器

    1 测试中提交数据有延时1min,所以查询数据是否提交成功要设置定时器. 固定定时器页面:单位是毫秒 [dinghanhua] 2 集合点.Synchronizing Timer 集合点编辑:集合用户 ...

  8. android基础(三)ContentProvider

    ContentProvider主要用于在不同的应用程序之间实现数据共享,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性,目前内容提供其实android实现跨 ...

  9. php大力力 [044节] PHP的POST语句一定要大写!!if(!empty($_POST['id'])) {

    早上花了几个小时,寻找错误!!! 不应该这样写 if(!empty($_Post['id'])) { 应该这样写 if(!empty($_POST['id'])) { 万万不能小谢!

  10. 进程间通信IPC:消息队列,信号量,共享内存

    2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...