黑马程序员_枚举

-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流!

与上篇文章介绍的相同,本文也是介绍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();

}

}

时间: 2024-10-13 21:10:27

黑马程序员_枚举的相关文章

黑马程序员_枚举总结

/* 1.枚举:枚举就是一个类,也即一种数据类型,引用数据类型.只不过是一个特殊的类.这个类的引用(变量)或者这种数据类型的变量(引用),它的值是由定义该数据类型的人来指定的,即它的取值是在枚举中定义好的,就那么几个值,如果不是这些列出来的值,编译器在编译的时候就会报错. 2.枚举的好处:将一种数据类型的所有取值限定在指定范围内.使得该数据类型的变量在取值时,不会出现非法赋值的情况,如果有,则可以在编译时期就被发现,避免了一些错误赋值导致的问题发生. 3.枚举的定义: enum 枚举类型名 //

黑马程序员_学习IOS之字典常用的方法

字典是无序的 数组是有序的.字典分为:可变字典和不可变字典  不可变字典对象 NSDictionary * dict = [[NSDictionary alloc]initWithObjectsAndKeys:@"one",@"1",@"two",@"2",@"three",@"3",@"four",@"4", nil]; //value = ke

黑马程序员_交通灯管理系统

(1)项目的需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 例如: 由南向而来去往北向的车辆 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 平时开车过十字路口红绿灯的时候,也知道红绿灯运行的顺序 (1)任何方向的车,向右边转弯的时候,是不需要看红绿灯 (2)在十字路口,相对方向的红绿灯的工作方式是一样的,南相对与北,东相对与西,这把它分成两对 (3)红绿灯顺序,一对直行通道绿灯直行车辆,等直行变红,还是这对的车辆可以左转,等左转变红,就轮到下一对了.所以在设计程序的时候,只

黑马程序员_银行业务调度系统

1,项目的具体需求 银行业务调度系统 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如交水电费.电话费之类业务的客户). 异步随机生成各种类型的客户,生成各类型用户的概率比例为: VIP客户 :普通客户 :快速客户 = 1 :6 :3.   客户办理业务所需时间有最大值和最小值,在该范围内随机设定每个VIP客户以及普通客户办理业务所需的时间,快速

黑马程序员_毕向东_Java基础视频教程_Java基础学习知识点总结

黑马程序员_毕向东_Java基础视频教程 Java基础学习知识点总结 2016年01月06日  day01 一.基础知识:软件开发 1.什么是软件?软件:一系列按照特定顺序组织的计算机数据和指令的集合. 2.常见的软件:系统软件:如:DOS,Windows,Linux等.应用软件:如:扫雷,迅雷,QQ等. 3.什么是开发?制作软件. 二.基础知识:人机交互方式 4.软件的出现实现了人与计算机之间的更好的交互. 5.交互方式:图形化界面:这种方式简单直观,使用者易于接受,容易上手操作.命令行方式:

黑马程序员_高新技术_1_Java反射

------- android培训.java培训.期待与您交流! ---------- 0.反射知识体系 下图为反射整体的知识体系,把握住此图也就全局上掌握住反射所有内容. 1.反射概论 1)反射概念 其实字面上可以这么理解反射,平时使用类时都是由类new出对象,而反射则是通过对象"反射"出类的信息,好比一个人照镜子可以看到人类的特征,而看出机制就是镜子反射. 2)Java对象两种类型 Java程序中的许多对象在运行时会出现两种类型:编译时类型和运行时类型.如下代码: Person p

黑马程序员_集合

集合1.集合和对象数组的区别: 数组的长度不可变,集合的可变: 数组可以存储基本数据类型和对象,集合只能存储对象. 集合的框架图 集合派系的顶层接口Collection1.Collection集合存储对象的方法: add(E e)将元素存储到集合中 addAll(Collection c)将一个集合添加到另外的集合中2.Collection集合提取对象的方法: 通过迭代器iterator中的方法:hasNext()和next()来取出 Iterator it=new iterator(); wh

黑马程序员_多线程

------- android培训.java培训.期待与您交流! ---------- 多线程1.进程: 正在运行的程序所占有的内存空间,叫做进程. 线程: 一个应用程序中的子程序,对于CPU,子程序可以有一条独立的执行路径,称为线程. 线程特点:依靠一个应用程序,对于其他子程序,独立被CPU执行的2.多线程的好处: 充分利用CPU的资源,程序的同时运行,提高效率3.java中线程创建的两种方法: 第一种: 定义类继承Thread class extends Thread 重写Thread中的r

黑马程序员_ 利用oc的协议实现代理模式

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用. 在看过李明杰老师的课程后,我对代理模式有了最初步的理解,虽然还很浅显 但是也明白了代理模式的 一些作用跟用法.首先使用代理模式可以降低耦合度.大大的增强了代码的弹性. 举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票 最简单的方式就是 建立一个person类(小明) 一个agent类(代理类) ag