您的位置:首页 > 编程语言 > Java开发

Java读书笔记十六(Java中的枚举类)

2015-12-01 15:18 579 查看
 
 前言
 在java开发中,有时候一个类的对象是有限而且固定的,比如我们常见的季节类,就是春夏秋冬。只有这四个简单的对象而已,这些实例有限而且固定的类,在java中,被称为枚举类。
 
 什么是枚举类?
 在以前的代码中,可能会直接使用简单的静态常量来表示枚举,例如以下所示
  public static final String TURN_FLATTEN_QUEUE_EXCEPTION = "turn-flatten-queue-exception";
public static final String CSR_BY_HIERARCHY = "csr-by-hierarchy";
public static final String CSR_BY_TASK = "csr-by-task";
public static final String CSR_BY_UPDATE = "csr-by-update";

 但是以上的代码看起来有点罗嗦,并且也不知道每个变量的实际含义。所以java5中增加了Enum关键字,它与平常的class,interface关键字的地位相同,都用来定义枚举类。但是它又与平常的类有区别,区别如下所示:
 1.枚举类可以实现一个或者多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类。
 2.使用enum定义,非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
 3.枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private。
 4.枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不可能产生实例。

enum Color {
RED, GREEN, BLANK, YELLOW;

}


 枚举类的成员变量和构造器
 枚举类也是一种类,只是有些地方比较特殊而已,因此它也可以定义成员变量、方法和构造器。

 Gender类
 package com.test;
public enum Gender {

MAILE,FEMALE;
//定义一个public修饰的实例变量
public String name;

}


GenderTest类
 package com.test;

public class GenderTest {

public static void main(String[] args) {
// 通过Enum的valueof()方法来获得指定枚举类的枚举值
Gender gender = Enum.valueOf(Gender.class, "FEMALE");
// 直接为枚举值的name实例变量赋值
gender.name = "女";
System.out.println(gender.name);
}
}


 正如上述所示,在枚举类中定义变量,并且为变量赋值,但实际这样做并不好,枚举类通常应该设计为不可变类,也就是说,它的成员变量值不应该运行改变。这样会更加安全,而且代码更加简洁。因此我们可以通过构造器来传参。
package com.test;
public enum Gender {

MAILE("男"),FEMALE("女");
//定义一个public修饰的实例变量
public String name;

//枚举构造器只能通过private修饰
private Gender(String name){
this.name=name;
}

public String getName() {
return name;
}

}


 实现了接口的枚举类
 /**
* @FileName: Gender2.java
* @Package:com.test
* @Description: TODO
* @author: LUCKY
* @date:2015年12月1日 下午3:10:39
* @version V1.0
*/
package com.test;

/**
* @ClassName: Gender2
* @Description: TODO
* @author: LUCKY
* @date:2015年12月1日 下午3:10:39
*/

interface GenderDesc{
void info();
}

public enum Gender2 implements GenderDesc {

// MAILE,FEMALE;
//
// public void info() {
// System.out.println("实现的代码如下");
// }

MAILE{

public void info() {
System.out.println("我是男生");
}
},

FEMAIL{

public void info() {
System.out.println("我是女生");
}

}
}

class test{
public static void main(String[] args) {
Gender2.FEMALE.info();
}
}

 正如上述代码所示,有两种方法分别实现了接口。

 包含抽象方法的枚举类
  假设有一个Operation类枚举类,它的4个枚举值PLUS,MIUS,TIMES,DIVIDES分别代表加减乘除,除了这几个对象外,还需要为枚举类定义一个计算的方法。
/**
* @FileName: Operation.java
* @Package:com.test
* @Description: TODO
* @author: LUCKY
* @date:2015年12月1日 下午3:16:05
* @version V1.0
*/
package com.test;

/**
* @ClassName: Operation
* @Description: TODO
* @author: LUCKY
* @date:2015年12月1日 下午3:16:05
*/
public enum Operation {
PLUS {

public double eval(double x, double y) {
return x+y;
}

};

//为枚举类定义一个抽象方法
//这个抽象的方法由不同的枚举值提供不同的实现
public abstract double eval(double x,double y);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: