- 浏览: 375721 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wangchong_kevin:
放在drawable-hdpi目录下的图片,如果在mdpi分辨 ...
BitmapFactory.Options 解决加载大图片OOM -
darren_nizna:
Netty 实战(精髓) http://gitlore. ...
Java NIO框架Netty教程(一) Hello Netty(转) -
大家来学习:
国内首部NIO+Netty5各种RPC架构实战演练课程观看地址 ...
Java NIO框架Netty教程(一) Hello Netty(转) -
lipeixiaoyu:
[color=red][/color]123
IOS UIView的clipsToBounds属性 -
ramon1989:
问一下,你的SimpleChannelHandler是哪个包下 ...
Java NIO框架Netty教程(一) Hello Netty(转)
一、概述
枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。Tiger 专家、developerWorks 的多产作者 Brett McLaughlin 将解释枚举的定义,介绍如何在应用程序中运用枚举,以及它为什么能够让您抛弃所有旧的 public static final 代码。
枚 举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值, 而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。
二、在枚举类型之前,Java是如何实现枚举功能的
在枚举类型出现之前,java是通过在接口或者类中定义public static final 的变量来实现的。比如,对于经典的红色警戒2中的英国狙击(sharp-shooter)手三个动作的描述:
/**
* 狙击手活动
*/
public interface SharpShooter_1 {
public static final int LOCKED = 1; //锁定
public static final int AIM = 2; //瞄准
public static final int SHOOT = 3; //射击
}
* 狙击手活动
*/
public interface SharpShooter_1 {
public static final int LOCKED = 1; //锁定
public static final int AIM = 2; //瞄准
public static final int SHOOT = 3; //射击
}
/**
* 测试方法
*/
public class TestDemo_1 {
public static void main(String args[]) {
TestDemo_1 test = new TestDemo_1();
test.doAction(1);
test.doAction(2);
test.doAction(3);
test.doAction(4);
}
/**
* 执行的动作
* @param action
*/
public void doAction(int action) {
switch (action) {
case SharpShooter_1.LOCKED:
System.out.println("1:锁定目标");
break;
case SharpShooter_1.AIM:
System.out.println("2:瞄准目标");
break;
case SharpShooter_1.SHOOT:
System.out.println("3:射击");
break;
default:
System.out.println("×:游戏还没有定义此动作!");
}
}
}
* 测试方法
*/
public class TestDemo_1 {
public static void main(String args[]) {
TestDemo_1 test = new TestDemo_1();
test.doAction(1);
test.doAction(2);
test.doAction(3);
test.doAction(4);
}
/**
* 执行的动作
* @param action
*/
public void doAction(int action) {
switch (action) {
case SharpShooter_1.LOCKED:
System.out.println("1:锁定目标");
break;
case SharpShooter_1.AIM:
System.out.println("2:瞄准目标");
break;
case SharpShooter_1.SHOOT:
System.out.println("3:射击");
break;
default:
System.out.println("×:游戏还没有定义此动作!");
}
}
}
运行结果:
1:锁定目标
2:瞄准目标
3:射击
×:游戏还没有定义此动作!
2:瞄准目标
3:射击
×:游戏还没有定义此动作!
[说明]:当然SharpShooter_1也可以声明为class,还可以直接将常量定义到TestDemo_1中,如果常量只是在类内部使用,就声明为private或者是protected,如果声明为public,则通常是与类功能相联系的常数。
[注 意]:switch语句的条件只能接收数值或字符(byte、short、int或char)或枚举(enum)类型的变量名或表达式。如 果没有符合条件数值或字符,则执行default语句,default语句不是必须的,如果没有默认要处理的动作,则default语句可省略。 break语句的作用是跳出循环块。
三、枚举类型的等价实现
/** * 狙击手活动(枚举类型实现) */ public enum SharpShooter_2 { LOCKED, AIM, SHOOT }
/** * 测试普通枚举类型 */ public class TestDemo_2 { public static void main(String args[]){ TestDemo_2 test=new TestDemo_2(); test.doAction(SharpShooter_2.LOCKED); test.doAction(SharpShooter_2.AIM); test.doAction(SharpShooter_2.SHOOT); } /** * 执行的动作 * @param action */ public void doAction(SharpShooter_2 action) { switch (action) { case LOCKED: System.out.println("1:锁定目标"); break; case AIM: System.out.println("2:瞄准目标"); break; case SHOOT: System.out.println("3:射击"); break; default: System.out.println("×:游戏还没有定义此动作!"); } } }
运行结果:
1:锁定目标
2:瞄准目标
3:射击
2:瞄准目标
3:射击
三、枚举类型的实质
在编译SharpShooter_2.java后,会生成一个SharpShooter_2.class文件,这说明枚举类型的实质还是一个类。因此,在某种程度上,enum关键字的作用就是class或者interface。
当使用enum定义一个枚举类型时,实际上所定义的类型自动继承了java.lang.Enum类。而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final的。可以直接通过枚举类型名直接使用它们,枚举类型名,可以转为一个数值,或作字符匹配的方法来识别类型,所以我们在写枚举类型的时候,可以简单理解为一个个的串。
在 查询JDK1.5文档的java.lang.Enum类,里面清楚的说明:java.lang.Enum类是所有 Java 语言枚举类型的公共基本类。因此,所有枚举类型都拥有有java.lang.Enum类所提供的共有方法。因此,要学会使用枚举,还必须认识 java.lang.Enum类。下面将详细说明。
四、java.lang.Enum类
public abstract class Enum<E extends Enum<E>>extends Objectimplements Comparable<E>, Serializable这是所有 Java 语言枚举类型的公共基本类。
------------------
构造方法摘要
protected Enum(String name,int ordinal)
单独的构造方法。程序员无法调用此构造方法。该构造方法用于由响应枚举类型声明的编译器发出的代码。
参数:
name - - 此枚举常量的名称,它是用来声明该常量的标识符。
ordinal - - 枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
------------------
方法摘要
protected Object clone()
抛出 CloneNotSupportedException。
int compareTo(E o)
比较此枚举与指定对象的顺序。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。该方法实现的自然顺序就是声明常量的顺序。
boolean equals(Object other)
当指定对象等于此枚举常量时,返回 true。
Class<E> getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。当且仅当 e1.getDeclaringClass() == e2.getDeclaringClass() 时,两个枚举常量 e1 和 e2 的枚举类型才相同。(由该方法返回的值不同于由 Object.getClass() 方法返回的值,Object.getClass() 方法用于带有特定常量的类主体的枚举常量。)
int hashCode()
返回枚举常量的哈希码。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。 与此方法相比,大多数程序员应该优先考虑使用 toString() 方法,因为 toString 方法返回更加用户友好的名称。该方法主要设计用于特殊情形,其正确性取决于获得正确的名称,其名称不会随版本的改变而改变
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 大多数程序员不会使用此方法。它被设计用于复杂的基于枚举的数据结构,比如 EnumSet 和 EnumMap。
String toString()
返回枚举常量的名称,它包含在声明中。
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。名称必须与在此类型中声明枚举常量所用的标识符完全匹配。(不允许使用额外的空白字符。)
参数:
enumType - 要从中返回常量的枚举类型的 Class 对象
name - 要返回的常量名称
注意:ordinal() 方法得到枚举顺序的索引,默认从0开始。
五、枚举的高级用法
1、枚举方法
既然枚举的本质是类,那么定义枚举类型时也可以定义方法。比如:
/** * 带方法的枚举类型 */ public enum SharpShooter_3 { LOCKED, AIM, SHOOT; public String getDesc() { switch (this.ordinal()) { case 0: return "锁定目标"; case 1: return "瞄准目标"; case 2: return "射击"; default: return "没有该枚举值!"; } } } /** * 测试枚举方法 */ public class TestDemo_3 { public static void main(String args[]) { for (SharpShooter_3 enumSS : SharpShooter_3.values()) { System.out.println(enumSS + " " + enumSS.getDesc()); } } }
运行结果:
LOCKED 锁定目标
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
2、枚举构造方法
/** * 带私有构造方法的枚举类型 */ public enum SharpShooter_4 { LOCKED("锁定目标"), AIM("瞄准目标"), SHOOT("射击"); private String desc; //枚举说明 /** * 私有的构造方法 */ private SharpShooter_4(String desc){ this.desc=desc; } /** * 获取枚举值的说明 * @return String */ public String getDesc(){ return desc; } } /** * 测试带私有构造方法的枚举类型 */ public class TestDemo_4 { public static void main(String args[]) { for (SharpShooter_4 enumSS : SharpShooter_4.values()) { System.out.println(enumSS + " " + enumSS.getDesc()); } } }
运行结果:
LOCKED 锁定目标
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
3、实现接口的枚举
/**
* 说明接口
*/
public interface IDesc {
/**
* 获取说明信息
* @return String
*/
public String getDesc();
}
* 说明接口
*/
public interface IDesc {
/**
* 获取说明信息
* @return String
*/
public String getDesc();
}
/**
* 实现了接口的枚举类型
*/
public enum SharpShooter_5 implements IDesc {
LOCKED("锁定目标"),
AIM("瞄准目标"),
SHOOT("射击");
private String desc; //枚举说明
/**
* 私有的构造方法
*/
private SharpShooter_5(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
* 实现了接口的枚举类型
*/
public enum SharpShooter_5 implements IDesc {
LOCKED("锁定目标"),
AIM("瞄准目标"),
SHOOT("射击");
private String desc; //枚举说明
/**
* 私有的构造方法
*/
private SharpShooter_5(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
/**
* 测试实现了接口的枚举类型
*/
public class TestDemo_5 {
public static void main(String args[]) {
for (SharpShooter_5 enumSS : SharpShooter_5.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
* 测试实现了接口的枚举类型
*/
public class TestDemo_5 {
public static void main(String args[]) {
for (SharpShooter_5 enumSS : SharpShooter_5.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
运行结果:
LOCKED 锁定目标
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
4、每个枚举值实现的自己的接口
/**
* 每个枚举值自己实现接口
*/
public enum SharpShooter_6 implements IDesc {
LOCKED(){
public String getDesc() {
return "锁定目标";
}
},
AIM{
public String getDesc() {
return "瞄准目标";
}
},
SHOOT{
public String getDesc() {
return "射击";
}
}
}
* 每个枚举值自己实现接口
*/
public enum SharpShooter_6 implements IDesc {
LOCKED(){
public String getDesc() {
return "锁定目标";
}
},
AIM{
public String getDesc() {
return "瞄准目标";
}
},
SHOOT{
public String getDesc() {
return "射击";
}
}
}
/**
* 测试每个枚举值自己实现接口
*/
public class TestDemo_6 {
public static void main(String args[]) {
for (SharpShooter_6 enumSS : SharpShooter_6.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
* 测试每个枚举值自己实现接口
*/
public class TestDemo_6 {
public static void main(String args[]) {
for (SharpShooter_6 enumSS : SharpShooter_6.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
运行结果:
LOCKED 锁定目标
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
5、带有抽象方法的枚举类型
/**
* 带有抽象方法的枚举类型
*/
public enum SharpShooter_7 {
LOCKED(){
public String getDesc() {
return "锁定目标";
}
},
AIM{
public String getDesc() {
return "瞄准目标";
}
},
SHOOT{
public String getDesc() {
return "射击";
}
};
/**
* 抽象方法,每个枚举值都必须自己实现
*
* @return String
*/
public abstract String getDesc();
}
* 带有抽象方法的枚举类型
*/
public enum SharpShooter_7 {
LOCKED(){
public String getDesc() {
return "锁定目标";
}
},
AIM{
public String getDesc() {
return "瞄准目标";
}
},
SHOOT{
public String getDesc() {
return "射击";
}
};
/**
* 抽象方法,每个枚举值都必须自己实现
*
* @return String
*/
public abstract String getDesc();
}
/**
* 测试带有抽象方法的枚举类型
*/
public class TestDemo_7 {
public static void main(String args[]) {
for (SharpShooter_7 enumSS : SharpShooter_7.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
* 测试带有抽象方法的枚举类型
*/
public class TestDemo_7 {
public static void main(String args[]) {
for (SharpShooter_7 enumSS : SharpShooter_7.values()) {
System.out.println(enumSS + " " + enumSS.getDesc());
}
}
}
运行结果:
LOCKED 锁定目标
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
AIM 瞄准目标
SHOOT 射击
Process finished with exit code 0
六、对Java枚举类型的一些看法
枚 举的本质是类,在没有枚举之前,仍然可以按照java最基本的编程手段来解决需要用到枚举的地方。枚举屏蔽了枚举值的类型信息,不像在用 public static final定义变量必须指定类型。枚举是用来构建常量数据结构的模板,这个模板可扩展。枚举的使用增强了程序的健壮性,比如在引用一个不存在的枚举值的时 候,编译器会报错。枚举的更多用法还需要在开发中去研究创造,Java5、Java6增加了不少新的特性,技术在升级,对程序员来说就要学习。
发表评论
-
tomcat下jsp乱码原因(下)
2015-09-16 14:13 692转自:http://blog.csdn.net/jgwei/ ... -
tomcat 下jsp乱码的原因分析(上)
2015-09-16 14:10 664转自 http://blog.csdn.net/jgwei/ ... -
JAVA数据源连接方式汇总
2015-07-23 10:28 825一、问题引入 在java程序中,需要访问数据库,做增删改查 ... -
java初始化块和构造方法的执行顺序
2015-06-09 11:18 639初始化块是ja ... -
Java 内存分配全面浅析
2014-02-20 10:56 759本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更 ... -
java 24小时和12小时制
2013-04-12 11:39 1192Date类,已经很少用了。用Calendar吧。 Calen ... -
BlockingQueue
2013-04-08 12:07 983前言: 在新增的Concu ... -
Java NIO框架Netty教程(四) ChannelBuffer(转)
2013-03-01 10:34 8082在学字符串消息收发(ht ... -
Java NIO框架Netty教程(三) 字符串消息收发(转)
2013-03-01 10:31 6345了解了Netty的基本概念( ... -
Java NIO框架Netty教程(二) 白话概念(转)
2013-03-01 10:20 7822"Hello World"的代 ... -
Java NIO框架Netty教程(一) Hello Netty(转)
2013-03-01 10:16 48802先啰嗦两句,如果你还不知道Netty是做什么的能做什么。那 ... -
Netty Channel 接口名词理解
2013-02-28 18:56 29181.Channel channel 是负责数据读,写的对象 ... -
Java中使用默认的密钥库和算法创建数字证书
2012-11-15 09:42 1174★ 实例说明 本实例使 ... -
keystore提取私钥和证书
2012-11-15 09:41 1968keytool -genkey -alias test -ke ... -
详细讲KeyTool
2012-11-15 09:39 1★ 实例说明 本实例使用J2SDK提供的keytool工具 ... -
http获取文件大小
2012-09-21 10:03 2068URL url = new URL(downloadUrl); ... -
android内存管理
2012-03-16 10:56 1很多开发者都是从j2me或j2ee上过来的,对于内存的使用和理 ... -
Playing Flash FLV Videos in Android applications
2012-03-14 14:37 1649Often when you create an app di ... -
调用Android系统“应用程序信息(Application Info)”界面
2012-02-21 18:45 0“Android系统设置->应 ... -
AsyncTask解决Android UI堵塞问题
2012-02-17 14:54 0AsyncTask解决Android UI堵 ...
相关推荐
总结来说,Java枚举类型提供了一种安全、类型安全的方式来定义和使用常量,它可以拥有构造器、方法和字段,并能与switch语句、序列化、反射等Java特性很好地结合。理解并熟练使用枚举,能够使代码更加清晰、易读,...
Java枚举类型是Java语言中一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的方式来表示一组有限的值。枚举在Java中被引入为一个完整的类型,不同于C++中的枚举,这使得Java枚举更加强大且易于使用...
使用Java枚举类型相比传统的`public static final`变量有许多优势: 1. **类型安全**: 枚举类型确保只能使用预定义的值,这有助于避免程序错误。 2. **自动实现接口**: 枚举类型自动实现了`Serializable`和`...
总结起来,Java枚举类型是一个强大的工具,它可以替代`static final`常量来表示一组固定的值,提供类型安全、易于维护的代码。通过枚举,我们可以更方便地管理常量,减少错误,并增加代码的灵活性。枚举是Java中一个...
总结,Java枚举类型是一种强大的工具,可以用于表示固定数量的常量。它们提供了一种安全、类型化的方式,避免了硬编码常量,增加了代码的可读性和可维护性。通过构造函数、方法、接口实现等特性,枚举可以适应各种...
### Java中枚举类型的使用详解 #### 一、引言 在软件开发过程中,经常会遇到需要定义一组固定的常量的情况,比如系统中的状态值、选项等。这些常量的定义方式直接影响到代码的可读性、可维护性和扩展性。在Java...
总结起来,Java枚举类型提供了丰富的功能,包括但不限于定义常量、属性、方法,以及实现抽象方法。这种类型使得代码更加规范,提高了代码的可读性和可维护性,减少了错误的可能性。在处理一组固定不变的值时,使用...
Java枚举(enum)是Java语言中的一种特殊数据类型,用于定义一组有限的常量,这些常量在程序中作为固定的值使用。枚举在Java中被引入,目的是为了更好地管理和使用常量,提高代码的可读性和安全性。在本实例代码中,...
枚举类型可以有自己的构造器,但只能在枚举声明时使用,并且不能是公有的。这允许在创建枚举实例时进行初始化操作。 ```java public enum Planet { MERCURY(3.303e+23, 2.4397e6), VENUS(4.869e+24, 6.0518e6), ...
枚举类型(`enum`)是Java中的一种特殊类,它允许开发者定义一组命名的常量,并将其视为一个独立的类型。从JDK 1.5版本开始,Java引入了枚举类型,它提供了一种更加安全且易于维护的方式来表示一组固定的选项。 ###...
### Java中的“枚举类型”知识点详解 #### 一、引言 在Java编程语言中,枚举(Enum)作为一种特殊的类,其设计初衷是为了更好地处理一组固定不变的常量集合。相较于传统的使用`static final`字段来表示常量的做法...
在Spring Boot项目中,枚举类型(Enums)的使用是一种常见的数据表示方式,它们提供了类型安全和可维护性。本文将深入探讨如何在Spring Boot应用中实现枚举类型的最佳实践,包括前端与后端交互、数据库操作以及序列...
在 Java 中,枚举类型可以使用 enum 关键字来定义。 在 Spring Boot 应用程序中,枚举类型经常被用于定义一些固定的值,例如订单状态、用户角色等。然而,在使用枚举类型时,需要注意一些坑,否则可能会出现一些...
总结来说,Java 5引入的枚举类型极大地提高了代码的可读性和安全性,同时提供了灵活的抽象能力,允许我们在枚举中定义方法、属性和构造函数。通过使用枚举,开发者可以更好地管理常量,防止类型错误,并利用`switch`...
在Java 5中,枚举类型作为一种新特性被引入,主要用于定义一组固定的、相关的常量集合。通过枚举类型,我们可以更加清晰地组织并限制程序中可用的常量选项,从而提高代码的可读性和可维护性。 例如,在文档中提到的...
总结来说,Java枚举类型是为了解决传统整型枚举模式的不足而设计的,它提供了类型安全、良好的可读性和可扩展性,是编写高质量Java代码的重要工具。在实际开发中,应优先考虑使用枚举类型来定义固定的、有限的选项...
### JAVA中的枚举类型2:高级特性 #### 概述 枚举类型是Java语言中一个非常实用且灵活的功能。通常情况下,我们将其用于表示一组固定的常量集合,如一周中的几天、颜色选项等。然而,Java中的枚举类型远不止于此。...
总结来说,Java的枚举类型为开发者提供了一种强大且类型安全的方式来表示一组有限的、不可变的值。它简化了代码,提高了可读性,并允许进行更多的类型检查和错误预防。在编写涉及固定选项或状态的代码时,枚举类型...