Fine, 我写这个是因为在读Calendar的时候发现对枚举类(enum)的使用不熟悉。
使用原因
- 清晰明了。例如枚举类SeasonEnum表示的季节,它的实例变量就都代表季节。与直接定义常量相比更容易区分。
- 打印输出意义明确。若打印SEASON_SPRING就只打印一个数字。若使用枚举可根据枚举实例名打印出属性
创建第一个枚举类
public enum SeasonEnum {
//默认自动添加public static final
SPRING,
SUMMER,
FALL,
WINTER;
}
注意两点:
- 使用关键字enum
- 枚举值之间用逗号隔开, 最后一个值以分号结束。
枚举类里面的值代表着它的每一个实例。
有属性的枚举类
//默认自动添加public static final
SPRING("春"),
SUMMER("夏"),
FALL("秋"),
WINTER("冬");
private final String name;
private SeasonEnum(String name){
this.name = name;
}
public String getName() {
return name;
}
// 打印Spring实例代表的值
System.out.println(SeasonEnum.SPRING.getName());
输出:春
枚举类的values方法可以返回所有枚举实例
for(SeasonEnum enumItem : values()){
System.out.println(enumItem);
}
输出:
SPRING
SUMMER
FALL
WINTER
抽象枚举类
枚举类是一种特殊的类…那也是类啊,所以也可以实现接口。抽象枚举类就是包含了抽象方法的枚举类,所以系统会默认使用abstrat方法修饰。Of course, 非抽象枚举类默认使用fianl进行修饰的。
// 定义一个接口
public interface Info {
void info();
}
枚举类实现该接口
SPRING("春"),
SUMMER("夏"),
FALL("秋"),
WINTER("冬");
private final String name;
private EnumSub(String name){
this.name = name;
}
public String getName() {
return name;
}
public void info(){ // 实现该方法
System.out.println("hello?");
}
public static void main(String[] args) {
EnumSub.SPRING.info();
}
// 输出hello?
这样有一个缺点就是所有实例的info方法的输出结果是一样的。So, 如果要不同的实例表现出不同的行为,可以使用匿名内部类。
//其余部分与上一部分代码大致类似
SPRING("春"){
public void info(){
System.out.println("春天");
}
},
SUMMER("夏"){
public void info(){
System.out.println("夏天");
}
},
FALL("秋"){
public void info(){
System.out.println("秋天");
}
},
WINTER("冬"){
public void info() {
System.out.println("冬天");
}
};
// test
EnumSub.SPRING.info();
EnumSub.WINTER.info();
输出:
春天
冬天