一、枚举类型
enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
枚举类的常用方法
- name(); 返回enum实例声明时的名字。
- ordinal(); 返回一个int值,表示enum实例在声明的次序。
- equals(); 返回布尔值,enum实例判断相等
- compareTo() 比较enum实例与指定对象的顺序
- values(); 返回enum实例的数组
- valueOf(String name) 由名称获取枚举类中定义的常量
枚举类的真面目
用javap查看一个枚举类的字节码
Compiled from "Shrubbery.java"
public final class enumtest.Shrubbery extends java.lang.Enum<enumtest.Shrubbery> {
public static final enumtest.Shrubbery GROUND;
public static final enumtest.Shrubbery CRAWLING;
public static final enumtest.Shrubbery HANGING;
public static enumtest.Shrubbery[] values();
public static enumtest.Shrubbery valueOf(java.lang.String);
static {};
}
- Shrubbery枚举变成了一个final修饰的类,也就是说,它不能被继承啦。
- Shrubbery是java.lang.Enum的子类。
- Shrubbery定义的枚举值都是public static final修饰的,即都是静态常量。
- 当一个Java类第一次被真正使用到的时候静态资源被初始化、Java类的加载和初始化过程都是线程安全的。
向枚举中添加新的方法
因为枚举本质上就是Enum的子类,所以可以给他添加任意的方法。
public enum OrderStatusEnum {
UNPAID(0, "未付款"), PAID(1, "已付款"), SENDED(2, "已发货"), FINISH(3, "已完成"),;
//成员变量
private int index;
private String desc;
//get方法
public int getIndex() {
return index;
}
public String getDesc() {
return desc;
}
//构造器方法
OrderStatusEnum(int index, String desc) {
this.index = index;
this.desc = desc;
}
//普通方法
public static OrderStatusEnum of(int index){
for (OrderStatusEnum temp : values()) {
if (temp.getIndex() == index) {
return temp;
}
}
return null;
}
}
枚举实现接口
所有枚举类都继承于java.lang.Enum,所以枚举不能再继承其他类了。但是枚举可以实现接口
public interface ISeasonBehaviour {
void showSeasonBeauty();
String getSeasonName();
}
public enum SeasonEnum implements ISeasonBehaviour {
SPRING(1,"春天"),SUMMER(2,"夏天"),FALL(3,"秋天"),WINTER(4,"冬天"),
;
private int index;
private String name;
SeasonEnum(int index, String name) {
this.index = index;
this.name = name;
}
public int getIndex() {
return index;
}
public String getName() {
return name;
}
//接口方法
@Override
public void showSeasonBeauty() {
System.out.println("welcome to " + this.name);
}
//接口方法
@Override
public String getSeasonName() {
return this.name;
}
}
枚举类比较是用==还是equals
不管用==还是equals,都是可以的。其实枚举的equals方法,就是用==比较的.
枚举实现的单例
- 枚举单例写法简单
- 枚举可解决线程安全问题
- 枚举可解决反序列化会破坏单例的问题
public class SingletonEnumTest {
public enum SingletonEnum {
INSTANCE,;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static void main(String[] args) {
SingletonEnum.INSTANCE.setName("jay@huaxiao");
System.out.println(SingletonEnum.INSTANCE.getName());
}
}










网友评论