原始的接口定义常量
public interface IConstants {
String MON = "Mon";
String TUE = "Tue";
String WED = "Wed";
String THU = "Thu";
String FRI = "Fri";
String SAT = "Sat";
String SUN = "Sun";
}
语法(定义)
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类
(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,
而 E 表示枚举类型的名称。
枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,
在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
package com.hmw.test;
/**
* 枚举测试类
*/
public enum EnumTest {
MON, TUE, WED, THU, FRI, SAT, SUN;
}
这段代码实际上调用了7次 Enum(String name, int ordinal):
new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
... ...
遍历、switch 等常用操作
对enum进行遍历和switch的操作示例代码:
public class Test {
public static void main(String[] args) {
for (EnumTest e : EnumTest.values()) {
System.out.println(e.toString());
}
System.out.println("----------------我是分隔线------------------");
EnumTest test = EnumTest.TUE;
switch (test) {
case MON:
System.out.println("今天是星期一");
break;
case TUE:
System.out.println("今天是星期二");
break;
// ... ...
default:
System.out.println(test);
break;
}
}
}
输出结果:
MON
TUE
WED
THU
FRI
SAT
SUN
----------------分隔线------------------
enum 对象的常用方法介绍
int compareTo(E o)
比较此枚举与指定对象的顺序。
Class<E> getDeclaringClass()
返回与此枚举常量的枚举类型相对应的 Class 对象。
String name()
返回此枚举常量的名称,在其枚举声明中对其进行声明。
int ordinal()
返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
String toString()
返回枚举常量的名称,它包含在声明中。
static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
返回带指定名称的指定枚举类型的枚举常量。
总结
可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,
不同之处是:enum 不能使用 extends 关键字继承其他类,
因为 enum 已经继承了 java.lang.Enum(java是单一继承)。
一、枚举实现的原理
通过关键字enum创建枚举类型在编译后事实上也是一个类类型
该类继承自java.lang.Enum类
例子:
enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
这个编译后,这些枚举值实际上会编译成public static final 类型的变量,并且通过
static块初始化值。
static{
MONDAY = new Day("MONDAY", 0);
}
二、常用方法
1、name():返回此枚举常量的名称
2、toString():返回此枚举常量的名称
3、equals(Object other):当指定对象等于此枚举常量时,返回 true。
4、values():返回枚举值数组
5、valueOf():根据常量名词返回枚举值
6、可以重写有参构造方法,指定多个枚举值的常量属性
SUCCESS(0, "success"),
ResultStatus(Integer code, String msg){
this.code = code;
this.msg = msg;
}
7、如果是默认的无参构造器,()里面的第一个参数就是枚举常量值
三、用法:
(1):定义抽象方法(枚举策略模式): 可在公共方法中代替if else代码
securityGroupsList() {
@Override
public void apply(JSONObject json) {
}
},
public abstract void apply(JSONObject json);
EnumOpenStackJson.valueOf(fsOpenStackMethod).apply((JSONObject) json);