2020年6月19日
枚举类型
枚举类型,我一直使用的少,看了一篇文章,其中有说使用枚举实现单例模式的,感觉挺有意思的。
原文:https://mp.weixin.qq.com/s/U5FkL9zyzr0PkAp8MJJ8BQ
还可以结合这一篇看看,理解会更深入https://blog.csdn.net/u011277123/article/details/104523638?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1
以四季举例子,如果要season中定义春夏秋冬,4个常量,提供打印当前季节和下个季节等方法,势必需要写不少if else。这个时候可以使用enum类型
public enum Season {
SPRING(0), SUMMER(1), AUTUMN(2), WINTER(3);
private int value;
private Season(int value){
this.value = value;
}
public static Season getNextSeason(Season nowSeason){
int nextDayValue = nowSeason.value;
if(++nextDayValue == 3){
nextDayValue = 0;
}
return getSeasonByValue(nextDayValue);
}
public static Season getSeasonByValue(int value){
for(Season s : Season.values()){
if(s.value == value){
return s;
}
}
return null;
}
}
class Test{
public static void main(String[] args){
System.out.println("nowSeason->"+Season.SPRING+", value->"+Season.SPRING.ordinal());
System.out.println("nextSeason->"+Season.getNextSeason(Season.SPRING));
}
}
以上是复制的代码,因为可以定义的时候,带上int值,方便了很多操作。
枚举也可以实现单例
因为enum类型实现时候是继承Enum类型,并且是final的,其中所有的属性和方法也是static的,所以保证了enum类型使用时候的线程安全性。只在初始化时候创建一次。所以是用来做单例控制的好办法。
public class SingletonObject {
private SingletonObject() {
}
private enum Singleton {
INSTANCE;
private final SingletonObject instance;
Singleton() {
instance = new SingletonObject();
}
private SingletonObject getInstance() {
return instance;
}
}
public static SingletonObject getInstance() {
return Singleton.INSTANCE.getInstance();
}
}
总结一个,枚举类型继承了Enum,反编译后可以看出,属性都是静态的,都是创建时候初始化,同时Enum对象不能反射创建实例,所以写单例很方便。