第三条:使用私有构造器或者枚举类型强化Singleton属性
1, Singleton指的是只能被实例化一次的类。
2, 实现Singleton有3中方法,分别是:
我们可以看到a,b两个方法都是把构造方法私有化了,然后分别通过静态域去实例化。这样做的好处是可以保证客户端能够访问该类的唯一实例。但是要提醒一点,客户端可以借助AccessibleOject.setAccessible方法,通过反射机制去访问私有的构造方法,如果要防御这样的攻击,可以在私有构造方法被要求创建第二个的时候抛出异常。
在b的方法是通过静态工厂去实例化的。其优势在于提供了灵活性。工厂方法返回该类的唯一实例,但是也可以容易的被修改。第二个优势和泛型有关。
3, 为了使用这其中(a,b)一种方法实现的Singleton类变成可序列化的(Serializable)仅仅加上implement Serializable是不够的。为了保证Singleton,必须声明所有实例域是瞬时(transient)的,并提供一个readResolve方法,否则当在反序列化一个序列化的时候,会创建一个新的对象导致出现假冒的现象。
4, C方法是实现Singleton的最佳方法,因为他在功能上合公有域方法(a)相近,但更加简洁,提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。
分享到:
相关推荐
在 Java 中实现 Singleton 属性有两种方式,一种是使用私有构造器强化 Singleton 属性,另一种是使用枚举强化 Singleton 属性。对于第一种方法,可以使用私有构造器来实例化公有的静态 final 域,然后使用静态方法 ...
### Effective Java读书笔记(上) #### 第一章 引言 本书主要针对Java开发者提供了大量实用的编程指导建议,帮助读者提升代码质量和程序性能。在本章节中,我们将重点介绍对象的创建与销毁,以及一些重要的设计...
枚举类型可以有自己的构造器,但只能在枚举声明时使用,并且不能是公有的。这允许在创建枚举实例时进行初始化操作。 ```java public enum Planet { MERCURY(3.303e+23, 2.4397e6), VENUS(4.869e+24, 6.0518e6), ...
Java语言中的构造方法私有化是一种常见的编程技巧,主要用于实现特定的设计模式,如单态模式(Singleton Pattern)。在Java中,私有构造方法是通过将构造函数声明为private来实现的,这使得其他类无法直接实例化该类...
在本压缩包中,"Java 枚举类型案例"可能包含了多个示例,以帮助我们深入理解Java枚举类型的使用。 1. **枚举的定义** 在Java中,枚举是通过关键字`enum`来定义的。例如,创建一个表示星期的枚举类型: ```java ...
实现单例时,通常会使用私有构造器防止外部创建实例,同时提供一个静态方法用于获取唯一的实例。Java中常使用双重检查锁定(Double-Check Locking)或枚举方式来实现线程安全的单例。 ```java // 双重检查锁定示例 ...
这是最简单的Singleton实现方式,通过静态初始化器在类加载时就创建了Singleton实例。 ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {}...
Java枚举是面向对象编程中的一个重要特性,它用于定义固定的常量集合,这些常量通常代表某种特定的数据类型。在Java中,枚举提供了一种更安全、更规范的方式来处理常量,相比于传统的final static变量,枚举具有更多...
Item 3: Enforce the singleton property with a private constructor or an enum type Item 4: Enforce noninstantiability with a private constructor Item 5: Prefer dependency injection to hardwiring ...
#### EJ 第3条:用私有构造器或枚举类型强化Singleton属性 单例模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。Kotlin通过`object`关键字进一步简化了单例模式的实现,使得创建...
当编译器遇到枚举类型时,会自动为每个枚举常量创建一个私有的构造函数,并在类的静态初始化块中创建实例。这些实例存储在静态字段中,确保它们在类加载时创建,因此枚举对象是线程安全的。例如,反编译后的 `Color...
Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中...
### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...
单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制资源的共享,减少系统开销,以及在多线程环境中避免...
简单的单例模式举例Singleton 分为恶汉式 懒汉式
首先,Singleton模式的核心在于控制类的实例化过程,通常通过私有构造函数和静态成员函数来实现。`Singleton.cpp`和`Singleton.h`两个文件中可能包含了以下内容: 在`Singleton.h`中,我们定义Singleton类: ```...
通常,我们会将构造函数设为私有(private),然后提供一个静态方法来获取类的唯一实例。这个静态方法通常被称为“单例方法”。 在Java中,实现单例模式有多种方式: 1. 饿汉式(Eager Initialization): 这种...
4. **私有构造函数与赋值运算符**:Singleton的构造函数和赋值运算符都声明为私有的,防止外部代码直接创建或复制Singleton对象,确保只有一个实例存在。 5. **模板化实现**:为了减少代码重复,可以使用模板类来...
Java中的Singleton(单例模式)是一种常用的软件设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以节省系统资源,例如数据库连接或者线程池...
【Java并行(4):线程安全前传之Singleton1】 在Java编程中,Singleton设计模式是一种常用的设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,实现线程安全的Singleton至关...