1 枚举类介绍
对于对象有限且固定的类,使用枚举类。 特别是定义一组常量是,强烈建议使用枚举类。
如:
- 星期:Monday, Tuesday, …, Sunday
- 季节:Spring, summer, autumn, winter
- 性别:male, female
2 自定义枚举类
jdk5.0
之前,枚举类需要自己定义。因为枚举类用于对象有限且固定的情况,所以自己定义的枚举类一般建议:
- 构造方法私有
private
,防止构造新的对象。枚举值要调用对应的构造器来创建 - 枚举类的成员声明为
private final
- 枚举类的对象成员声明为
public static final
简单的例子:
/**
* Gender枚举类,对性别进行枚举
*/
class Gender {
// 属性声明
private final String name;
private final String describe;
// 私有化构造器
private Gender(String name, String describe) {
this.name = name;
this.describe = describe;
}
// 实例化枚举类能提供的有限个对象
public static final Gender MAN = new Gender("man", "Gender: man");
public static final Gender WOMAN = new Gender("woman", "Gender: woman");
// 如果有必要,可以提供get方法获取属性信息
public String getName() {
return name;
}
public String getDescribe() {
return describe;
}
}
3 通过enum定义枚举类
使用enum关键字
定义枚举类。(enum关键字和class、interface的作用相似)
enum Gender2 {
// 首行列出所有枚举对象,直接 `对象名(构造方法参数)` ,对象之间用 `,` 隔开
MAN("man", "gender: man"), // public static final Gender2 MAN = new Gender2("man", "gender: man")
WOMAN("woman", "gender: man");
// 属性声明
private final String name;
private final String describe;
// 私有化构造器
private Gender2(String name, String describe) {
this.name = name;
this.describe = describe;
}
// 如果有必要,可以提供get方法获取属性信息
public String getName() {
return name;
}
public String getDescribe() {
return describe;
}
}
- 枚举类注意事项:
- 枚举类默认继承
java.lang.Enum
类。
java.lang.Enum
类常用方法
Enum类的常用方法,可以由用户自己定义的枚举类使用。(继承)values()
:返回枚举类型的对象数组valueOf(String str)
:将str字符串转化为同名的枚举类对象toString()
:返回当前枚举类对象的名称
- 非抽象枚举类默认使用
final
修饰,不能派生子类。
- 枚举类默认继承
注意:
- 枚举类的实例通过
类名.实例名
调用。 - switch的控制表达式可以是任何枚举类型,case表达式的值可以直接用枚举对象的名字,不需要添加枚举类作为限定。
Gender2 b = Gender2.MAN;
switch (b) {
case MAN: System.out.println("man");break;
case WOMAN: System.out.println("woman");break;
}
4 枚举类实现接口
枚举类可以和普通类一样实现接口,但这种实现使得每个枚举实例的接口实现方法都一样。若要为每个枚举值提供不同实现方式,参照匿名对象实现:
//接口
public interface GenderDesc{
void info();
}
//枚举类实现接口
public enum Gender implements GenderDesc{
MALE("男"){
public void info(){
System.out.println("这个枚举值代表男性");
}
},
FEMALE("女"){
public void info(){
System.out.println("这个枚举值代表女性");
}
};
private final String name;
private Gender(String name){
this.name=name;
}
}
注意:此时的枚举值不是Gender枚举类的实例,而是Gender的匿名子类的实例。
5 抽象枚举类
- 枚举类中有抽象方法时,系统自动为其添加
abstract关键字
,不能手动添加。 - 枚举值中要重写枚举类的抽象方法。
package org.ywq.absenumclass;
public enum Operation {
ADD {
public double oper(double x, double y) {
return x + y;
}
},
SUB {
public double oper(double x, double y) {
return x - y;
}
},
MUL {
public double oper(double x, double y) {
return x * y;
}
},
DIV {
public double oper(double x, double y) {
return y == 0 ? y : x / y;
}
};
// 抽象方法
public abstract double oper(double x, double y);
public static void main(String[] args) {
System.out.println(Operation.ADD.oper(1.2, 2.1));
System.out.println(Operation.SUB.oper(1.2, 2.1));
System.out.println(Operation.MUL.oper(1.2, 2.1));
System.out.println(Operation.DIV.oper(1.2, 2.1));
}
}