`
jaesonchen
  • 浏览: 311737 次
  • 来自: ...
社区版块
存档分类
最新评论

用私有构造器或者枚举类型enum强化singleton

 
阅读更多
public class Singleton {
	
	private static Singleton instance = new Singleton();
	private Singleton() { }
	
	public static Singleton getInstance() {
		return instance;
	}
	
	public void service() {
		System.out.println("Singleton.service...");
	}
	
	public static void main(String[] args) {
		
		EnumSingleton singleton = EnumSingleton.INSTANCE;
		singleton.setName("enum singleton");
		singleton.service();
		
		Singleton.getInstance().service();
	}

}

enum EnumSingleton implements Serializable {
	
	INSTANCE;
	
	private String name = "default";
	public void setName(String name) {
		this.name = name;
	}

	public void service() {
		System.out.println("EnumSingleton.service..." + this.name);
	}
}

 

 * 用私有构造器或者枚举类型enum强化singleton:
   enum Sigleton 在功能上与静态工厂方法相近,但它更简洁,无偿地提供了序列化机制,绝对防止多次实例化,

   即使是在面对复杂的序列化和反射攻击的时候。
   单元素的enum已经成为实现Singleton的最佳方法。
   1.线程安全

   2.不会因为序列化而产生新实例

   3.防止反射攻击

 * enum默认extends Enum类,所以不能再extends其他类,只能通过接口扩张。
   因为一个enum常量(这里是INSTANCE)代表了一个enum的实例,enum类型只能有这些常量实例。
   标准保证enum常量(INSTANCE)不能被克隆,也不会因为反序列化产生不同的实例,想通过反射

   机制得到一个enum类型的实例也不行的。 

 * 如果用一般方式写单例模式,该单例类如果实现了Serializable接口,则必须添加readResolve()方法。

分享到:
评论

相关推荐

    Java私有构造器使用方法示例

    在 Java 中实现 Singleton 属性有两种方式,一种是使用私有构造器强化 Singleton 属性,另一种是使用枚举强化 Singleton 属性。对于第一种方法,可以使用私有构造器来实例化公有的静态 final 域,然后使用静态方法 ...

    effective Java(第3版)各章节的中英文学习参考(已完成).zip

    请考虑构建器)Item 3: Enforce the singleton property with a private constructor or an enum type(使用私有构造函数或枚举类型实施单例属性)第 4 条使用私有构造函数强制不可实例化(用初始化构造函数实施不可...

    单例模式(singleton)

    这通常通过私有化构造函数和提供一个公共静态方法(称为单例工厂方法)来实现。在Java中,单例模式的实现有多种方式: 1. 饿汉式(Static Singleton):在类加载时就创建了唯一实例,线程安全,但可能会造成资源...

    单例模式(Singleton)的6种实现

    Java中的枚举类型是线程安全的,并且只会装载一次,设计者充分考虑到了线程安全问题,因此使用枚举实现单例模式是一种简洁而且高效的解决方案。 6. 容器式单例(Singleton Holder) 通过一个私有的静态内部类...

    java设计模式之单例模式

    7. **构造器私有化单例(Private Constructor Singleton)** 构造器私有化,外部无法通过`new`关键字实例化,只能通过指定的工厂方法获取单例。 ```java public class Singleton { private static class ...

    JAVASE面试题,JAVASE面试题

    private Singleton() {} // 构造器私有化,防止外部直接创建实例 public static Singleton getInstance() { return instance; } } ``` 饿汉式在类加载时就完成了初始化,因此是线程安全的,但可能会造成资源...

    设计模式_创建型_单例模式.md

    Java的反射API提供了获取构造器(Constructor)并创建对象的能力,如果构造器允许被访问,那么即使是私有的构造器也可以通过反射得到。因此,即使实现了单例模式,反射仍可能导致破坏单例模式的实例唯一性。在单例的...

    第6讲_单例模式(Singleton)

    这样的设计可以避免资源浪费,尤其在处理那些需要共享状态且频繁使用的对象时,例如日志记录器、配置管理器或者数据库连接池。 在Java中,单例模式的实现通常有两种主要方式:饿汉式和懒汉式。 **饿汉式单例**: ...

    Java练习reflect,singleton,DomAndSax

    而“singleton method.txt”很可能是讲解或展示了不同类型的单例实现方式,包括传统的单例模式和基于枚举的单例实现。 通过深入学习和实践这三个主题,你将能更好地理解和掌握Java的核心特性,以及在实际项目中如何...

    单例模式简介和java代码实现

    实现代码:public class Singleton { private Singleton() { // 私有化构造函数 } private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton...

    单例设计模式个人总结+摘录

    1. **避免反射攻击**:在私有构造器中添加条件判断,如`if (instance != null)`,这样即便反射尝试创建新实例也会被阻止。 2. **避免反序列化攻击**:为单例类实现`readResolve()`方法,确保即使反序列化也不会创建...

    JavaSE 面试题 (2).docx

    - 构造器私有化,防止其他类通过new关键字创建实例。 - 创建并保存该类的唯一实例,通常使用静态变量存储。 - 提供一个公共的静态方法或属性,以便外部获取这个唯一的实例。 常见的单例实现方式有以下几种: - **...

    击穿单例模式的Demo示范代码

    私有构造函数防止外部直接创建实例,静态方法则用于在需要时返回唯一的实例。例如: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static ...

    Java中控制创建对象的个数

    1. **私有构造器(Private Constructor)**:这是最常用的控制对象创建的方式,特别是用于实现单例模式。通过将类的构造器声明为私有,外部类无法直接实例化它。例如: ```java public class Singleton { private ...

    唯一实例SingleObject

    1. 私有化构造函数:这是Singleton模式的基础,通过将构造函数设为私有,防止其他类直接实例化对象。 ```java private SingleObject() {} ``` 2. 静态内部类或者枚举方式:这两种方式都是为了在保证线程安全的同时...

    Java单例模式

    1. **私有构造器**: 单例类的构造器通常被声明为`private`,这样其他类无法通过`new`关键字直接创建该类的实例。这是防止外部代码实例化单例对象的第一道防线。 2. **静态内部类**: 在上述例子中,单例对象`...

    Java se 面试题.docx

    单例模式的关键点在于构造器私有化、静态变量保存实例以及提供一个全局访问点。在Java中,单例模式常用于控制对全局资源的访问,比如数据库连接池、缓存服务等。理解并能熟练应用单例模式是Java开发者的基本功。

    设计模式面试专题.pdf

    在Java中,通过私有构造器和静态方法来实现,线程安全的单例可以使用枚举或双重检查锁定(double-checked locking)来创建。例如: ```java public enum Singleton { INSTANCE; } // 或者使用双重检查锁定 public...

Global site tag (gtag.js) - Google Analytics