一、 枚举简单介绍
JAVA枚举类型 Enum, 枚举可以存储一系列固定常用的 常量,每个枚举常量都是一个实例,而且是大写的,就像下面这个简单的例子
public enum TestEnum {
YELLOW,RED;
}
枚举常量直接用逗号隔开,用分号结束。
默认继承了java.lang.Enum, 所以枚举类型不能继承类(但是可以继承抽象类),可以实现接口。 同时每个 枚举常量都是当前枚举类的一个对象,编译器默认会在每个常量
前面 添加 public static final 这个修饰符。 所以访问枚举常量 都是直接 Class.filed这种方式, 枚举类默认采用 私有的 无参构造器, 所以 它也不能被直接 new出来。
上面那段代码换成下面这种方式也可以(默认调用无参构造器生成该实例):
public enum TestEnum {
YELLOW() ,RED();
}
当然你希望生成有参的构造器也是可以的,如下:
public enum TestEnum {
YELLOW(),GREY("红色") ;
private TestEnum(){
}
private TestEnum(String str){
this.value = str;
}
private String value;
public String getValue() {
return value;
}
}
也可以加入抽象方法,这样每个实例就会被要求实现该抽象方法如下代码:
public enum TestEnum {
YELLOW() {
@Override
public void getLocalStr() {
}
},
,GREY("红色") {
@Override
public void getLocalStr() {
System.out.println("优秀");
}
};
private TestEnum(){
}
private TestEnum(String str){
this.value = str;
}
private String value;
public String getValue() {
return value;
}
public abstract void getLocalStr();
}
二、常用场景 1、作为普通的常量使用,如星期、季节、颜色、城市等等;通常配合switch语句使用。 例1: 定义
//周一到周天枚举
public enum WeekEnum {
MON,TUES,WED,THURS,FRI,SAT,SUN;
}
使用
//jdk1.7开始switch语句开始支持String类型,而jdk1.6之前只支持int,char,enum类型,使用枚举的话,能使代码的可读性大大增强
public class TestEnum {
public static void main(String[] args) {
WeekEnum week = WeekEnum.TUES;
switch (week) {
case MON:
System.out.println("星期一");
break;
case TUES:
System.out.println("星期二");
break;
case WED:
System.out.println("星期三");
break;
case THURS:
System.out.println("星期四");
break;
case FRI:
System.out.println("星期五");
break;
case SAT:
System.out.println("星期六");
break;
case SUN:
System.out.println("星期天");
break;
}
}
}
2、往枚举中添加变量、构造函数、以达到灵活获取指定值的目的(注: Java 要求必须先定义 enum 实例,否则编译会报错);通常用于一些业务系统中定义一些固定值,如用于匹配db中的字段值等。
例2:
定义
//利用构造函数将变量赋值,然后通过get方法获取指定值
public enum CompanyEnum {
SF("顺丰速运", 1001), YTO("圆通速递", 1002),STO("申通物流",1003),YD("韵达快运",1004),YZPY("中国邮政",1005);
private CompanyEnum(String company, int code) {
this.company = company;
this.code = code;
}
private String company; // 公司名称
private int code; // 公司编码
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
}
使用
//输出->1001 、 顺丰速运
public class TestEnum {
public static void main(String[] args) {
System.out.println(CompanyEnum.SF.getCode());
System.out.println(CompanyEnum.SF.getCompany());
}
}
例3:
定义
//性别枚举[0:男 1:女 2:未知]
public enum GenderEnum {
MAN(0),WOMEN(1),UNKNOWN(2);
private int code; //编码标识
private GenderEnum(int code){
this.code = code;
}
public int getCode() {
return code;
}
}
使用
//输出->0 、 1 、 2
public class TestEnum {
public static void main(String[] args) {
System.out.println(GenderEnum.MAN.getCode());
System.out.println(GenderEnum.WOMEN.getCode());
System.out.println(GenderEnum.UNKNOWN.getCode());
}
}
3、往枚举中添加自己特定方法,以实现自己所需的相关业务逻辑。
例4:
定义
public enum CompanyEnum {
SF("顺丰速运", 1001), YTO("圆通速递", 1002), STO("申通物流", 1003), YD("韵达快运", 1004), YZPY("中国邮政", 1005);
private CompanyEnum(String company, int code) {
this.company = company;
this.code = code;
}
private String company; // 公司名称
private int code; // 公司编码
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
//根据物流公司名字获取对应的编码
public static int getCodeByCompany(String company) {
for (CompanyEnum c : CompanyEnum.values()) {
if (c.getCompany().equals(company.trim())) {
return c.code;
}
}
return 0;
}
//根据物流公司编码获取对应的名字
public static String getCompanyByCode(int code) {
for (CompanyEnum c : CompanyEnum.values()) {
if (c.getCode() == code) {
return c.getCompany();
}
}
return null;
}
}
使用
//输出->1001 、 圆通速递
public class TestEnum {
public static void main(String[] args) {
System.out.println(CompanyEnum.getCodeByCompany("顺丰速运"));
System.out.println(CompanyEnum.getCompanyByCode(1002));
}
这种枚举用法,通常还可用于系统的错误码与对应的错误码描述,然后根据错误码获取错误码对应的描述。
三、其它用法
java中的枚举还有许多其它的用法,如重写toString()、equals()等方法,实现接口、枚举Map等等,但感觉其实用的并不是很多,这里就不再详述了,直接给2个简单的例子吧。
例5:
/**
* 枚举本身的一些方法使用
*/
public class TestEnum {
public static void main(String[] args) {
//返回此枚举常量的名称,继承自java.lang.Enum类,通常重写该方法以实现相关操作。输出->SF
System.out.println(CompanyEnum.SF.toString());
//返回此枚举常量的名称。输出->SF
System.out.println(CompanyEnum.SF.name());
//返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。输出->0
System.out.println(CompanyEnum.SF.ordinal());
//获取枚举中的常量个数。输出->5
System.out.println(CompanyEnum.SF.values().length);
//返回带指定名称的指定枚举类型的枚举常量。输出->顺丰速运
System.out.println(CompanyEnum.SF.valueOf(CompanyEnum.class, "SF").getCompany());
//比较此枚举与指定对象的顺序;SF位置是0,YTO位置是1,结果为 0-1=-1。输出->-1
System.out.println(CompanyEnum.SF.compareTo(CompanyEnum.YTO));
//返回与此枚举常量的枚举类型相对应的 Class 对象。输出->class com.cndmss.util.CompanyEnum
System.out.println(CompanyEnum.SF.getDeclaringClass());
//。输出->true
System.out.println(CompanyEnum.SF.name().equals("SF"));
//。输出->true
System.out.println(CompanyEnum.SF.equals(CompanyEnum.SF));
//。输出->false
System.out.println(CompanyEnum.SF.equals(CompanyEnum.YTO));
}
}
例6:
/**
*EnumSet、EnumMap的使用
*/
public class TestEnum {
public static void main(String[] args) {
//1、 EnumSet的使用
EnumSet companySet = EnumSet.allOf(CompanyEnum.class);
for (CompanyEnum company:companySet) {
System.out.println(company.getCode() + ":" + company.getCompany());
}
//2、EnumMap的使用
EnumMap companyMap = new EnumMap(CompanyEnum.class);
companyMap.put(CompanyEnum.SF, "顺丰map");
companyMap.put(CompanyEnum.YTO, "圆通map");
Iterator> iter = companyMap.entrySet().iterator();
while(iter.hasNext()){
Entry entry = iter.next();
System.out.println(entry.getKey().name() + ":" + entry.getValue());
}
}
}