`
jguangyou
  • 浏览: 370853 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java5 枚举类型使用总结(转)

阅读更多
一、概述

枚举(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 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:射击
×:游戏还没有定义此动作!
[说明]:当然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:射击
三、枚举类型的实质
在编译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
 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
3、实现接口的枚举
/**
* 说明接口
*/

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 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

4、每个枚举值实现的自己的接口
/**
* 每个枚举值自己实现接口
*/

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());
}
}
}
运行结果:
LOCKED 锁定目标
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 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
六、对Java枚举类型的一些看法
枚 举的本质是类,在没有枚举之前,仍然可以按照java最基本的编程手段来解决需要用到枚举的地方。枚举屏蔽了枚举值的类型信息,不像在用 public static final定义变量必须指定类型。枚举是用来构建常量数据结构的模板,这个模板可扩展。枚举的使用增强了程序的健壮性,比如在引用一个不存在的枚举值的时 候,编译器会报错。枚举的更多用法还需要在开发中去研究创造,Java5、Java6增加了不少新的特性,技术在升级,对程序员来说就要学习。
分享到:
评论

相关推荐

    简单总结java枚举类型

    简单总结java枚举类型,适合java初学者

    Java枚举的七种常见用法总结(必看)

    下面小编就为大家带来一篇Java枚举的七种常见用法总结(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java基础知识点总结.docx

    Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 ...

    java实验报告.docx

    实验十一 Java 枚举类型的应用 18 实验十二 Java 集合框架程序设计应用 22 实验十三 Java 反射与注解程序应用 31 实验十四 Java 数据库程序设计应用 36 实验十五 Java Swing 图形用户界面程序设计应用 43 实验十六 ...

    Java工作笔记-枚举类型反射

    这里枚举类型有自己的反射方式: 这里我先总结下逻辑: 1. 通过getEnumConstatnts返回目前枚举中存在的对象。 2. 通过getMehod获取方法。 3. 最后用这个对象调用其方法。 程序运行截图如下: 其中对应的枚举: ...

    三分钟快速掌握Java中枚举(enum)

    enum的全称为enumeration, 是 JDK 1.5中引入的新特性,存放在 java....下面这篇文章是我在使用enum过程中的一些经验和总结,分享出来方便大家快速的掌握Java中枚举(enum),有需要的朋友们下面跟着小编来一起看看吧。

    Java 基础核心总结 +经典算法大全.rar

    《Java 基础核心总结》 Java 概述 什么是 Java2 Java 的特点Java 开发环境 JDK JRE Java 开发环境配置 Java 基本语法 数据类型基础语法运算符 Java 执行控制流程条件语句 if 条件语句 if...else 条件语句if...else ...

    java 编程入门思考

    3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 ...

    Java 2023最新面试知识点总结.pdf

    谈一谈”=“与”equals0"的区别。 《Think in Java》中说:“关系操作符生成的是一个boolean结果,...综上,对于枚举类型和原始数据类型的相等性比较,应该使用"一";对于引用类型的相等性比较,应该使用equals方法。

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解...

    Thinking in java4(中文高清版)-java的'圣经'

    类型信息 第15章 泛型 第16章 数组 第17章 容器深入研究 第18章 Java I/O系统 第19章 枚举类型 第20章 注解 第21章 并发 第22章 图形化用户界面 附录A 补充材料 可下载的补充材料 Thinking in C:Java的基础 Java...

    Thinking in Java简体中文(全)

    3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 ...

    java 面试题 总结

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byte...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《java jdk 7学习笔记》是作者多年来教学实践经验的总结,汇集了教学过程中学生在学习java时遇到的概念、操作、应用或认证考试等问题及解决方案。  《java jdk 7学习笔记》针对java se 7新功能全面改版,无论是...

    Java初学者入门教学

    3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 ...

    java联想(中文)

    3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 ...

    Java工程师面试复习指南

    Java基本数据类型 字符串和包装类 关键字最终特性 Java类和包 抽象类和接口 代码块和代码执行顺序 Java自动拆箱装箱里隐藏的秘密 Java中的Class类和Object类 Java异常 解读Java中的回调 反射 泛型 枚举类 Java注解和...

    JAVA_Thinking in Java

    3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 ...

    Thinking in Java 中文第四版+习题答案

    3.1 使用Java运算符 3.1.1 优先级 3.1.2 赋值 3.1.3 算术运算符 3.1.4 自动递增和递减 3.1.5 关系运算符 3.1.6 逻辑运算符 3.1.7 按位运算符 3.1.8 移位运算符 3.1.9 三元if-else运算符 3.1.10 逗号运算符 3.1.11 ...

    java IO章节的总结

    SequenceInputStream(Enumeration e)枚举类型e中包含了若干个要被串联的输入流 SequenceInputStream(InputStream s1, InputStream s2)先读取s1中数据。再读s2的数据。 以上能够直接对数据进行读和写的流叫节点流...

Global site tag (gtag.js) - Google Analytics