枚举
什么是枚举类型
单例模式是一个类只有一个实例,而枚举可以理解为多例,一个类有多个实例,单实例的个数不是无穷个,而是有限个。比如,一个星期类的实例只有七个,星期一到星期七。
实现多例类
import org.junit.Test;
public class Demo1 {
@Test
public void func1(){
MyEnum myEnum = MyEnum.A;
myEnum.hello();
}
}
/*
* 创建多例类
*/
class MyEnum{
public static final MyEnum A = new MyEnum();
public static final MyEnum B = new MyEnum();
public static final MyEnum C = new MyEnum();
private MyEnum(){
}
public void hello(){
System.out.println("hello!");
}
public static MyEnum valueOf(String s){
if(s.equals("A")){
return A;
}
else if(s.equals("B")){
return B;
}
else {
return C;
}
}
}
定义枚举类型
定义枚举类型需要使用enum关键字,比如:
public enum Direction{
FRONT,BEHIND,LEFT,RIGHT;
}
//调用时:
Direction d = Direction.FRONT;
Java1.5新增的枚举类型可以让我们在使用枚举时不用再自己创建多例类,可以使用枚举。创建枚举类的语法:
使用enum关键字
类体中只需要给出枚举项,多个枚举项之间使用逗号分隔
枚举类中可以使用构造器,方法和实例变量,如果枚举类中只有枚举项,可以省略最后一个枚举项后面的分号
枚举类需要注意的几点
枚举类的构造器,必须是private,默认不写也为private,枚举类的实例不能由外界来创建。
枚举类型可以在switch中使用,但是在case中不能使用case Direction.FRONT,因为编译器会根据switch中d的类型来判断每个枚举类型,在case中必须给出与d相同类型的枚举选项,而不能再有类型。
Direction d = Direction.FRONT;
switch(d) {
case FRONT: System.out.println("前面");break;
case BEHIND:System.out.println("后面");break;
case LEFT: System.out.println("左面");break;
case RIGHT: System.out.println("右面");break;
default:System.out.println("错误的方向");
}
Direction d1 = d;
System.out.println(d1);
所有枚举类都是Enum的子类
Enum,是所有枚举类的公共父类无需使用extends继承,Enum中的方法所有枚举类都拥有。
int compareTo(E e):比较两个枚举常量谁大谁小,其实比较的就是枚举常量在枚举类中声明的顺序,例如FRONT的下标为0,BEHIND下标为1,那么FRONT小于BEHIND;
boolean equals(Object o):比较两个枚举常量是否相等;
int hashCode():返回枚举常量的hashCode;
String name():返回枚举常量的名字;
int ordinal():返回枚举常量在枚举类中声明的序号,第一个枚举常量序号为0;
String toString():把枚举常量转换成字符串;
static T valueOf(Class enumType, String name):把字符串转换成枚举常量。
枚举类可以有成员
枚举类和正常的类一样,可以有实例变量,实例方法,静态方法等等,只不过它的实例个数有限,不能再创建实例。
/*
* 定义枚举项,指定调用的构造器,并传递参数。
* 枚举类在实际编译过程中使用的还是public static final MyEnum A = new MyEnum();
* 重载了构造函数,所以A(要传入的参数和构造函数的参数一致)
*/
enum MyEnum2{
A("AAA"), B("BBB"), C("CCC");
private MyEnum2(String name){
System.out.println(name);
}
}
因为MyEnum2类只有一个唯一构造器,参数为string,所以在构造器中也要为其赋值。
枚举类中可以存在抽象方法
在枚举类中存在的抽象方法,在写枚举项时使用内部类实现该方法。
/*
* 如果枚举类中包含抽象方法
* 对每个枚举项进行使用内部类来实现
*/
enum MyEnum3{
A(){
@Override
public void function() {
System.out.println("AAAAA");
}
}, B(){
@Override
public void function() {
System.out.println("BBBBB");
}
}, C(){
@Override
public void function() {
System.out.println("CCCCC");
}
};
public abstract void function();
}
枚举类enum的value()方法
在Enum的API文档中没有找到这个方法,这个方法可以获取把枚举项放入一个枚举类的数组中。下面是枚举类和测试代码。
//枚举类
enum Myenum4{
A(1,"AAA"), B(2,"BBB"), C(3,"CCC");
private String message;
private int ordinal;
private Myenum4(int i, String s){
message = s;
ordinal = i;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getOrdinal() {
return ordinal;
}
public void setOrdinal(int ordinal) {
this.ordinal = ordinal;
}
}
//测试方法
@Test
/*
* 枚举类的value()方法测试
*/
public void func4(){
Myenum4[] myenum4s = Myenum4.values();
for(Myenum4 m : myenum4s){
System.out.println(m + "(" + m.getOrdinal() + ", " + m.getMessage() + ")");
}
}