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 中实现 Singleton 属性有两种方式,一种是使用私有构造器强化 Singleton 属性,另一种是使用枚举强化 Singleton 属性。对于第一种方法,可以使用私有构造器来实例化公有的静态 final 域,然后使用静态方法 ...
请考虑构建器)Item 3: Enforce the singleton property with a private constructor or an enum type(使用私有构造函数或枚举类型实施单例属性)第 4 条使用私有构造函数强制不可实例化(用初始化构造函数实施不可...
这通常通过私有化构造函数和提供一个公共静态方法(称为单例工厂方法)来实现。在Java中,单例模式的实现有多种方式: 1. 饿汉式(Static Singleton):在类加载时就创建了唯一实例,线程安全,但可能会造成资源...
Java中的枚举类型是线程安全的,并且只会装载一次,设计者充分考虑到了线程安全问题,因此使用枚举实现单例模式是一种简洁而且高效的解决方案。 6. 容器式单例(Singleton Holder) 通过一个私有的静态内部类...
7. **构造器私有化单例(Private Constructor Singleton)** 构造器私有化,外部无法通过`new`关键字实例化,只能通过指定的工厂方法获取单例。 ```java public class Singleton { private static class ...
private Singleton() {} // 构造器私有化,防止外部直接创建实例 public static Singleton getInstance() { return instance; } } ``` 饿汉式在类加载时就完成了初始化,因此是线程安全的,但可能会造成资源...
Java的反射API提供了获取构造器(Constructor)并创建对象的能力,如果构造器允许被访问,那么即使是私有的构造器也可以通过反射得到。因此,即使实现了单例模式,反射仍可能导致破坏单例模式的实例唯一性。在单例的...
这样的设计可以避免资源浪费,尤其在处理那些需要共享状态且频繁使用的对象时,例如日志记录器、配置管理器或者数据库连接池。 在Java中,单例模式的实现通常有两种主要方式:饿汉式和懒汉式。 **饿汉式单例**: ...
而“singleton method.txt”很可能是讲解或展示了不同类型的单例实现方式,包括传统的单例模式和基于枚举的单例实现。 通过深入学习和实践这三个主题,你将能更好地理解和掌握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()`方法,确保即使反序列化也不会创建...
- 构造器私有化,防止其他类通过new关键字创建实例。 - 创建并保存该类的唯一实例,通常使用静态变量存储。 - 提供一个公共的静态方法或属性,以便外部获取这个唯一的实例。 常见的单例实现方式有以下几种: - **...
私有构造函数防止外部直接创建实例,静态方法则用于在需要时返回唯一的实例。例如: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static ...
1. **私有构造器(Private Constructor)**:这是最常用的控制对象创建的方式,特别是用于实现单例模式。通过将类的构造器声明为私有,外部类无法直接实例化它。例如: ```java public class Singleton { private ...
1. 私有化构造函数:这是Singleton模式的基础,通过将构造函数设为私有,防止其他类直接实例化对象。 ```java private SingleObject() {} ``` 2. 静态内部类或者枚举方式:这两种方式都是为了在保证线程安全的同时...
1. **私有构造器**: 单例类的构造器通常被声明为`private`,这样其他类无法通过`new`关键字直接创建该类的实例。这是防止外部代码实例化单例对象的第一道防线。 2. **静态内部类**: 在上述例子中,单例对象`...
单例模式的关键点在于构造器私有化、静态变量保存实例以及提供一个全局访问点。在Java中,单例模式常用于控制对全局资源的访问,比如数据库连接池、缓存服务等。理解并能熟练应用单例模式是Java开发者的基本功。
在Java中,通过私有构造器和静态方法来实现,线程安全的单例可以使用枚举或双重检查锁定(double-checked locking)来创建。例如: ```java public enum Singleton { INSTANCE; } // 或者使用双重检查锁定 public...