2020年6月19日 作者 zeroheart

枚举类型

枚举类型,我一直使用的少,看了一篇文章,其中有说使用枚举实现单例模式的,感觉挺有意思的。

原文: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对象不能反射创建实例,所以写单例很方便。