单例模式添加枚举实现
This commit is contained in:
parent
5fe72c31d8
commit
9aebc4660f
|
@ -179,6 +179,52 @@ public class Singleton {
|
|||
|
||||
该实现可以防止反射攻击。在其它实现中,通过 setAccessible() 方法可以将私有构造函数的访问级别设置为 public,然后调用构造函数从而实例化对象,如果要防止这种攻击,需要在构造函数中添加防止实例化第二个对象的代码。但是该实现是由 JVM 保证只会实例化一次,因此不会出现上述的反射攻击。
|
||||
|
||||
#### Ⅵ 枚举实现
|
||||
|
||||
使用单元素的枚举类型来实现单例模式,相对于常规的单例模式,枚举实现的单例天生具有防止反射实例化对象和反序列化产生实例化对象,而且代码更加简洁,非常适合单例模式场景下使用。以下是枚举单例模式的实现。
|
||||
|
||||
```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 {
|
||||
Constructor<EnumSingleton> constructor = EnumSingleton.class.getDeclaredConstructor();
|
||||
constructor.setAccessible(true);
|
||||
EnumSingleton enumSingleton = constructor.newInstance();
|
||||
System.out.println(enumSingleton.getObjName());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
### Examples
|
||||
|
||||
- Logger Classes
|
||||
|
@ -2990,3 +3036,5 @@ public class ImageViewer {
|
|||
- [Design Patterns](http://www.oodesign.com/)
|
||||
- [Design patterns implemented in Java](http://java-design-patterns.com/)
|
||||
- [The breakdown of design patterns in JDK](http://www.programering.com/a/MTNxAzMwATY.html)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user