diff --git "a/notes/\350\256\276\350\256\241\346\250\241\345\274\217.md" "b/notes/\350\256\276\350\256\241\346\250\241\345\274\217.md" index 262fb788a4b1ef732a51dd72faa103e189708502..1d80e15161ed599de0d9ede09840cf338c6411ec 100644 --- "a/notes/\350\256\276\350\256\241\346\250\241\345\274\217.md" +++ "b/notes/\350\256\276\350\256\241\346\250\241\345\274\217.md" @@ -177,10 +177,44 @@ public class Singleton { #### Ⅵ 枚举实现 - ```java -public enum Singleton { - INSTANCE; -} +使用单元素的枚举类型来实现单例模式,相对于常规的单例模式,枚举实现的单例天生具有防止反射实例化对象和反序列化产生实例化对象,而且代码更加简洁,非常适合单例模式场景下使用。以下是枚举单例模式的实现。 + +```java + +public enum EnumSingleton { + INSTANCE; //单元素枚举实现单例 + + private String objName; + + public String getObjName() { + return objName; + } + + public void setObjName(String objName) { + this.objName = objName; + } + + public static void main(String[] args) { + // 单例测试 + EnumSingleton firstSingleton = EnumSingleton.INSTANCE; + firstSingleton.setObjName("firstName"); + System.out.println(firstSingleton.getObjName()); + + EnumSingleton secondSingleton = EnumSingleton.INSTANCE; + secondSingleton.setObjName("secondName"); + System.out.println(firstSingleton.getObjName()); + System.out.println(secondSingleton.getObjName()); + + // 反射获取实例测试 + try { + EnumSingleton[] enumConstants = EnumSingleton.class.getEnumConstants(); + for (EnumSingleton enumConstant : enumConstants) { + System.out.println(enumConstant.getObjName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } ``` 该实现在多次序列化再进行反序列化之后,不会得到多个实例。而其它实现,为了保证不会出现反序列化之后出现多个实例,需要使用 transient 修饰所有字段,并且实现序列化和反序列化的方法。