Java Enum类的几种用法
一、枚举常量
在JDK1.5 之前,定义常量的写法为: public static fianl… 。JDK1.5之后,就有了枚举类型,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
枚举类型的定义和class的定义很相像,下面是枚举类型的简单定义:
enum Myenum{
BIG,MEDIUM,SMAll
}
其中enum是用来生命枚举类的关键字,BIG,MEDIUM,SMALL是枚举变量。
二、switch case
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
public class TestEnum {
//声明枚举类(此处为内部类,可以直接拿到外部)
enum Myenum{
BIG,MEDIUM,SMAll
}
//主方法中使用枚举变量
public static void main(){
Myenum m = Myenum.MEDIUM;
switch(m){
case BIG:
System.out.println("大大大");
case MEDIUM:
System.out.println("中中中");
case SMAll:
System.out.println("小小小");
}
}
}
因为变量m的值是枚举变量的MEDIUM,所以对应case为MEDIUM的语句。
控制台输出为:中中中
三、枚举类的构造器
枚举类的构造器一定要私有,来防止从外部进行实例化(也就是不让在其他地方写:Myenum a =new Myenum(“a”); )。 枚举类中的枚举常量(如BIG、MEDIUM)其实是枚举类的实例,所以枚举常量的参数类型必须与已有构造器的参数类型相同。
下面是一个枚举类构造器的例子:
public enum Myenum {
// 与其他类型的实例一样,枚举实例的参数应与构造器的参数一致
BIG("大大大"), MEDIUM(20), SMALL("太小了", 10);
private String str;
private int i;
// 枚举的构造器要私有,防止被修改,下面是三种构造器
private Myenum(String str) {
this.str = str;
}
private Myenum(int i) {
this.i = i;
}
private Myenum(String str, int i) {
this.str = str;
this.i = i;
}
}
//我们在这个类中对枚举进行测试
public class TestEnum {
public static void main(String[] args) {
Myenum m = Myenum.SMALL;
System.out.println("Myenum 中的枚举常量SMALL中str:"+m.str+",i:"+m.i);
}
}
输出结果:
Myenum 中的枚举常量SMALL中str:太短了,i:10
四、枚举中的自定义方法
和三中的其他地方一致,只多了对str和i的getter,setter方法。测试中用方法取出enum中的私有变量。
public enum Myenum {
// 与其他类型的实例一样,枚举实例的参数应与构造器的参数一致
BIG("大大大"), MEDIUM(20), SMALL("太小了", 10);
private String str;
private int i;
// 枚举的构造器要私有,防止被修改,下面是三种构造器
private Myenum(String str) {
this.str = str;
}
private Myenum(int i) {
this.i = i;
}
private Myenum(String str, int i) {
this.str = str;
this.i = i;
}
//getter,setter方法
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
//我们在这个类中对枚举进行测试
public class TestEnum {
public static void main(String[] args) {
Myenum m = Myenum.SMALL;
System.out.println("Myenum 中的枚举常量SMALL中str:"+m.getStr()+",i:"+m.getI());
}
}
五、不能继承类,可以实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。 但可以对接口进行实现。因为实现方法和普通类一样,这里就不进行实现了。
六、使用接口组织枚举
没有枚举之前,通常把常量放到接口中来管理。现在,把枚举放到接口中,更加方便管理。
public interface Animal{
enum Dog implements Animal{
BIG_DOG,MEDIUM_DOG,SMALL_DOG
}
enum Cat implements Animal{
BIG_CAT,MEDIUM_CAT,SMALL_CAT
}
}
七、其他
1.集合
两个枚举集合:java.util.EnumSet和java.util.EnumMap。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。详细可以参考JDK文档。
2.比较
枚举类型对象之间的值比较可以使用==,直接来比较值是否相等的。当然,也可以使用equals方法进行比较。