与上篇文章介绍的相同,本文也是介绍jdk 1.5出现的新特性,本文将介绍枚举的相关用法。

在jdk 1.5 之前。Java可以有两种方式定义新类型:类和接口。对于大部分面向对象来说。这两种方法看起来似乎足够了。但是在一些特殊情况下,这些方法就不合适。例如:想定义一个Color类,它只能由Red、Green、Blue三种值,其他的任何形式都是非法的。那么jdk 1.5之前虽然可以构造出这样的发image,但是要做很多的工作,也就可能带来各种不安全的问题。而在 jdk 1.5之后引入的枚举类型(Enum)就能避免这些问题。

所谓的枚举就是规定好了指定的取值范围,所以都得内容只能从指定的范围中取得。使用简单类完成颜色的固定取值问题。也就是说一个类只能产生固定的几个对象。例如:

package enum_;

class Color{

public static final Color RED=new Color("红色");// 定义第一个对象

public static final Color GREEN=new Color("绿色");// 定义第一个对象

public static final Color BLUE=new Color("蓝色");// 定义第一个对象

private String name;

Color(String name){

this.name=name;

}

public static Color getInstance(int i){

switch(i){

case 1:return RED;

case 2:return GREEN;

case 3:return BLUE;

default:return null;

}

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

public class ColorDemo1 {

public static void main(String[] args) {

Color c1=Color.RED;//取得红色

System.out.println(c1.getName());

Color c2=Color.getInstance(3);

System.out.println(c2.getName());

}

}

此时程序限定了所能取的对象的范围,所以达到了枚举的功能,以上是一种枚举的方式,在早期的java开发中没有没有枚举这个概念,所以有时候也可以使用接口表示。

interface Color{

public static final int RED = 1 ;    // 定义红色

public static final int GREEN = 2 ;    // 定义绿色

public static final int BLUE = 3 ;    // 定义蓝色

}

因为以上的所有取值都是直接使用数字表示的,所以操作的时候会存在一些问题。比如:

public class ColorDemo02{

public static void main(String args[]){

System.out.println(Color.RED + Color.GREEN) ;    // 颜色相加

}

}

这个操作并不是很明确,所以在jdk 1.5之前如果要实现枚举操作就会比较麻烦。

Enum

从上文的描述可以清晰的了解到,使用enum关键字可以定义一个枚举,实际上这个关键字是java.lang.Enum类型,即使用enum声明的枚举类型相当于定义了一个类,只是这个类默认继承java.lang.Enum类

枚举类的主要操作方法

protected

Enum(String name, int ordinal)
          单独的构造方法

int

compareTo(E o)

比较此枚举与指定对象的顺序。

boolean

equals(Object other)

当指定对象等于此枚举常量时,返回 true。

protected  void

finalize()

          枚举类不能有 finalize 方法。

Class<E>

getDeclaringClass()

          返回与此枚举常量的枚举类型相对应的 Class 对象。

int

hashCode()

          返回枚举常量的哈希码。

String

name()

          返回此枚举常量的名称,在其枚举声明中对其进行声明。

int

ordinal()

          返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

String

toString()

          返回枚举常量的名称,它包含在声明中。

static

<T extends Enum<T>>

T

valueOf(Class<T> enumType, String name)

返回带指定名称的指定枚举类型的枚举常量。

构造方法介绍

构造方法中接收两个参数,一个表示枚举的名字,另一个表示枚举的序号(从0开始)

protected     Enum(String name, int ordinal)

构造枚举的第一种方式

enum Color{

RED,GREEN,BLUE;

}

上面的方法是一种简单的形式,在我们开发中遇到的情况往往比较复杂,比如使用一些文字表述定义枚举对象的信息,这时就需要使用第二种方式了。

enum Color{

RED("红色"),GREEN("绿色"),BLUE("蓝色");

private String name;

private Color(String name){

this.name=name;

}

}

如果不想通过构造实现设置内容,二十希望通过setter()方法实现,这时就必须按照以下的方式执行

enum Color {

RED, GREEN, BLUE;

private String name;

public String getName() {

return name;

}

public void setName(String name) {

switch (this) {

case RED:

if ("红色".equals(name))

this.name = name;//允许设置名字

else

System.out.println("设置内容错误");

break;

case GREEN:

if ("蓝色".equals(name))

this.name = name;//允许设置名字

else

System.out.println("设置内容错误");

break;

case BLUE:

if ("绿色".equals(name))

this.name = name;//允许设置名字

else

System.out.println("设置内容错误");

break;

}

}

}

集合框架对Enum的支持

EnumMap

类 EnumMap<K extends Enum<K>,V>

java.lang.Object

java.util.AbstractMap<K,V>

java.util.EnumMap<K,V>

所有已实现的接口:

Serializable, Cloneable, Map<K,V>

案例示范

enum Color {

RED, GREEN, BLUE;

}

public class EnumMapDemo {

public static void main(String[] args) {

Map<Color ,String >desc=null;//定义Map对象,同时指定类型

desc=new EnumMap<Color,String>(Color.class);//实例化EnumMap

desc.put(Color.RED,"红色");

desc.put(Color.GREEN,"率色");

desc.put(Color.BLUE,"蓝色");

System.out.println("====输出所有内容====");

for(Color c:Color.values()){

System.out.println(c.name()+":"+desc.get(c));

}

System.out.println("====输出所有键====");

for(Color c:desc.keySet()){

System.out.print(c.name()+"、");

}

System.out.println("====输出所有值====");

for(String s:desc.values()){

System.out.print(s+"、");

}

}

}

EnumSet

EnumSet是Set接口的子类,所以里面的元素是无法重复的,在使用EnumSet的时候是不能直接使用关键字new为其进行实例化的,所以在此类中提供了很多的静态方法。

案例示范:

enum Color {

RED, GREEN, BLUE;

}

public class EnumSetDemo {

public static void main(String[] args) {

demo1();

demo2();

demo3();

demo4();

demo5();

}

// 将枚举中的所有元素放到EnumSet中

private static void demo1() {

EnumSet<Color> es = null;// 声明一个EnumSet集合

System.out.println("===EnumSet.allOf(Color.class)===");

es = EnumSet.allOf(Color.class);// 将枚举中的所有元素放到EnumSet中

print(es);

}

// 只设置一个元素到集合中

private static void demo2() {

EnumSet<Color> es = null;// 声明一个EnumSet集合

System.out.println("===EnumSet.Of(Color.BLUE)===");

es = EnumSet.of(Color.BLUE);// 为集合添加指定的一个元素

print(es);// 打印该集合

}

// 创建只能存放指定枚举类型的集合

private static void demo3() {

EnumSet<Color> es = null;// 声明一个EnumSet集合

System.out.println("===EnumSet.noneOf(Color.class)===");

es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合

es.add(Color.BLUE);// 添加元素

// es.add("我的颜色");编译不通过

print(es);

}

// 创建不包含指定元素的集合

private static void demo4() {

EnumSet<Color> es = null;// 声明一个EnumSet集合

System.out.println("===EnumSet.complementOf(Color.BLUE)===");

es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合

es.add(Color.BLUE);// 添加元素

es.add(Color.RED);// 添加元素

EnumSet<Color> esNew = null;

esNew = EnumSet.complementOf(es);// 新的集合不包含上面指定元素

print(esNew);

}

// 拷贝一个集合

private static void demo5() {

EnumSet<Color> es = null;// 声明一个EnumSet集合

System.out.println("===EnumSet.copyOf(Color.BLUE)===");

es = EnumSet.noneOf(Color.class);// 指定es为只能添加Color事例的集合

es.add(Color.BLUE);// 添加元素

es.add(Color.RED);// 添加元素

EnumSet<Color> esNew = null;

esNew = EnumSet.copyOf(es);// 将一个集合拷贝给另一个集合

print(esNew);// 打印该集合

}

private static void print(EnumSet<Color> es) {// 专门用来输出的操作

for (Color c : es) {// 循环输出EnumSet中的内容

System.out.print(c + "、");

}

System.out.println();

}

}

二十五、JDK1.5新特性---枚举的更多相关文章

  1. 二十七、JDK1.5新特性---Annotation

    上篇文章介绍了反射的一些基础知识以及应用案例,本文将介绍jdk 1.5 出现的新特性——Annotation也就是我们所说的注解,即使用注释的方式加入一些程序的信息. 注解相当于一种标记,在程序中加了 ...

  2. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  3. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  4. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  5. JDK1.5新特性,基础类库篇,集合框架(Collections)

    集合框架在JDK1.5中增强特性如下: 一. 新语言特性的增强 泛型(Generics)- 增加了集合框架在编译时段的元素类型检查,节省了遍历元素时类型转换代码量. For-Loop循环(Enhanc ...

  6. JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

    JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...

  7. 策略模式 Strategy 政策Policy 行为型 设计模式(二十五)

    策略模式 Strategy   与策略相关的常见词汇有:营销策略.折扣策略.教学策略.记忆策略.学习策略.... “策略”意味着分情况讨论,而不是一概而论 面对不同年龄段的人,面对不同的商品,必然将会 ...

  8. C#学习基础概念二十五问

    C#学习基础概念二十五问 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal ...

  9. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

随机推荐

  1. mallmold开源商城系统网银在线chinabank支付插件

    最近没事捣鼓项目,找了个轻型商城系统mallmold,用起来还觉的挺不错的,尤其是mallmold中文版,赞一个.中文版集成了大部分主流支付系统,但因是个人网站,没法获得对应的服务,最终选择了网银在线 ...

  2. [canvas]用canvas绘制饼状图

    折线图之后又来饼状图啦~\(≧▽≦)/~啦啦啦 <!DOCTYPE html> <html lang="en"> <head> <meta ...

  3. include、require、include_once和require_once理解

    都是在当前文件中包含引入并运行指定文件,include和require的不通之处仅仅在于发生错误时include产生一个警告脚本继续执行,而require产生一个致命的错误,脚本停止运行.有了once ...

  4. ajax 通用方法,从thinkphp中拔出来的

    <?php /** * 设置页面输出的CONTENT_TYPE和编码 * @access public * @param string $type content_type 类型对应的扩展名 * ...

  5. amCharts图表组件

    amCharts提供了JavaScript/HTML5 Charts.Javascript/HTML5 Stock Chart.JavaScript Maps三种图表组件.amCharts图形效果炫丽 ...

  6. php usort 按照数组中的某个键值排序

    //php usort 按照数组中的某个键值排序 如果第一个参数小于第二个参数 -> 返回小于0的整数如果第一个参数等于于第二个参数 -> 返回等于0的整数如果第一个参数大于于第二个参数 ...

  7. 检索 COM 类工厂中 CLSID 解决办法

    我的服务器:windows server 2008(64位)+microsoft office 2007 企业版+windows服务应用程序 业务:调用msdn提供的SaveAsPDFandXPS.e ...

  8. 正经学C#_介绍与其编写基础:《c#入门经典》

    本文所讲内容,均可在<c#入门经典>中可以查询.如有错误,敬请指出.谢谢! C#:全称C Shar.是微软.Net Framework平台下最为主要的客户语言之一.个人理解,c#是微软最为 ...

  9. vmware rdm

    RDM即裸磁盘映射,基本思想就是将host的磁盘直接映射给虚拟机使用   需要讨论的是: 1.rdm磁盘是否允许设置为共享,即可以映射给多个虚拟机使用(vmware不可用)   在 vSphere W ...

  10. shell十三问

    1) 为何叫做 shell ?在介绍 shell 是甚幺东西之前,不妨让我们重新检视使用者与计算机系统的关系:图(FIXME)我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱 ...