Java SE 枚举类型详解
枚举的使用
一、枚举的历史
枚举是jdk1.5版本推出的,主要作用是确定某一个范围里的值
早先时候,程序员使用枚举需要通过定义类的方式来使用
public class Color{
private String name;
public static final Color RED = new Color("红色");
public static final Color GREEN = new Color("绿色");
public static final Color BLUE = new Color("蓝色");
public String getName(){
return name;
}
public String setName(String name){
this.name = name;
}
//私有构造函数
private Color(String name){
this.setName(name);
}
public static Color getInstance(int i){
if(i == 0) return RED;
if(i == 1) return GREEN;
if(i == 2) return BLUE;
return null;
}
}
调用时则应该先获取实例,再调用实例的getName方法
可以看到这种方法非常不方便
二、正式使用枚举
枚举的定义方法
public enum Color{RED,BLUE,PURPLE;}
枚举的使用方法
//枚举的简单使用
public class Main {
public static void main(String[] args) {
Color c = Color.RED;
System.out.println(c);
}
}//output:RED
枚举类和枚举关键字
枚举类指Enum,是规定枚举类型的母类。而枚举关键字则是定义了一个枚举,使用枚举关键字创建枚举时自动继承Enum。
设置枚举对象会调用枚举类的受保护的构造方法
枚举类包含更多常用的方法,方便代码编写
枚举类集的使用
EnumMap继承了Map接口,使用起来与Map没有区别,唯一的区别是构造函数中需要传入一个Enum类
public class Main {
public static void main(String[] args) {
EnumMap<Color, String> eMap = new EnumMap<Color, String>(Color.class);
eMap.put(Color.RED, "red");
eMap.put(Color.PURPLE, "purple");
eMap.put(Color.BLUE, "blue");
for (Map.Entry<Color, String> me : eMap.entrySet())
System.out.println(me.getKey() + "--->" + me.getValue());
}
}
//output:RED--->red BLUE--->blue PURPLE--->purple
EnumSet是一个抽象类,是Set接口的子类,没有明显的构造方法,此类的方法都是静态操作
allOf方法将枚举所有的内容设置到集合
noneOf方法返回一个空集合
public static void main(String[] args) {
EnumSet<Color> eSet = EnumSet.allOf(Color.class);
Iterator<Color> iterator = eSet.iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
枚举的构造函数方法
枚举可以直接定义构造方法,但需要注意的是,一旦定义,所有的枚举对象都必须明确的调用此方法。
枚举的构造方法不能是public,因为不允许外部调用。每一个枚举对象都有自己的name属性。
public enum Color {
//这里明确地调用了构造方法
RED("红色"),BLUE("蓝色"),PURPLE("紫色");
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Color (String name){
this.setName(name);
}
}
枚举接口
枚举接口可以定义一个抽象方法,枚举类可以实现该接口,如果没有定义枚举构造方法。则枚举类的每一个对象都需要实现枚举接口中定义的方法
public interface Info {
String getColor();
}
public enum Color implements Info {
RED{
@Override
public String getColor() {
return "红色";
}
},
GREEN {
@Override
public String getColor() {
return "绿色";
}
},
PURPLE {
@Override
public String getColor() {
return "紫色";
}
}
}
在枚举中定义抽象方法
和接口类似,可以在枚举中定义多个抽象方法。如果枚举中没有构造方法,则枚举中每个对象都需要实现该抽象方法.
public enum Color{
RED{
@Override
public String getColor() {
return "红色";
}
},
GREEN {
@Override
public String getColor() {
return "绿色";
}
},
PURPLE {
@Override
public String getColor() {
return "紫色";
}
};
public abstract String getColor();
}