`
小小黑咖啡
  • 浏览: 11318 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

第三条 用私有的构造器或者枚举类型强化singleton属性

阅读更多
第三条 用私有的构造器或者枚举类型强化singleton属性
首先说下singleton,设计模式叫单例模式,就是只被实例化一次的实例,是唯一的类。例如做单元测试时,你要测试数据库的增删改查,你不会new四个Connection吧?!new一个就够了,所有程序就用这一个就行了,节省内存资源,也节约了时间。ps一句:在web项目中每个客户端应该是自己一个connection,要不就全乱了。

singleton有3种写法:
(1)
public class Singleton {

	public static final Singleton s = new Singleton();
	//private constructor
	private Singleton() {
		
	}
	//other methods
}

代码分析:public static final的s 说明当new出Singleton时,s也出来了并且只有一个,私有的构造方法也验证了它的唯一性,所以Singleton是唯一个不可改变的。
缺点:通过反射机制,可以调用私有的构造器,让它在被要求第二个实例的时候抛出异常。

(2)
public class Singleton {

	private static final Singleton INSTANCE = new Singleton();
	//private constructor
	private Singleton() {
		
	}
	public Singleton getInstance() {
		return INSTANCE;
	}
	//other methods
}

代码分析:将唯一的成员变量变为private,并且提供方法getInstance访问唯一的自身。
这种代码好像是用的最多的一种,文中说“在每次反序列化的实例时,都会创建一个新的实例,所以提供一个方法:
private Object readResolve() {
	//Return the one true Singleton and let the garbage collector
	//take care of the singleton impersonator
	return INSTANCE;
}
”,这块完全不了,序列化和反序列化一点都不懂,所以没法解释,求路过的大神赐教。
(3)
public enum Singleton {

	INSTANCE;
	//other methods
}

这是最佳的方法,但是好像用的不多,还是我见识少啊,不了,代码很简单,不过我觉得没第二种好理解,我要写我写第二种,求大神解释。

本人能力有限,可以说是小菜鸟,看完的东西,解释出来肯定有不正确的,或者与真实有出入的,希望大神们有时间的话留言改正,再次谢过
分享到:
评论

相关推荐

    Effective-Java读书笔记(上)

    - **副作用**:使用私有构造器的一个副作用是使得该类不能被继承。 **避免创建不必要的对象**: 1. **不可变对象**:对于不可变对象,可以通过缓存已创建的对象来避免重复创建。 2. **使用静态工厂方法**:如果一...

    现代编程语言- Kotlin 之美 - 当下最火的编程语言欣赏.pdf

    #### EJ 第3条:用私有构造器或枚举类型强化Singleton属性 单例模式是一种常用的软件设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。Kotlin通过`object`关键字进一步简化了单例模式的实现,使得创建...

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

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

    Java练习reflect,singleton,DomAndSax

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

    JavaSE 面试题 (2).docx

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

    java面向对象编程单实例模式解析

    3. **系统必须能够访问该实例**:通常情况下,单实例模式会提供一个静态方法或者属性,以便外部代码能够获取到这个唯一的实例。 #### 单实例模式的应用场景 在软件开发中,单实例模式有着广泛的应用,比如打印机...

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

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

    单例模式.doc

    - **枚举方式**:利用枚举类型天然的线程安全性和唯一性实现单例模式,简洁高效。 #### 五、单例模式的适用场景 单例模式适用于以下情况: - 系统只需要一个实例对象时。 - 单例对象需要被共享,并且所有的实例...

    Java中控制创建对象的个数

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

    Java单例模式

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

    【05-面向对象(下)】

    •总之,第一步先找局部变量,第二步,内部类的属性,第三步。外部类的属性。 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ 静态内部类 •如果用...

    Java程序员面试题集.pdf,这是一份不错的文件

    第三十,switch不能作用于byte,但Java 7开始可以作用于char和枚举类型。Java 14引入了switch表达式,可以作用于String。 第三十一,编写Singleton模式的代码,一种常见方式是饿汉式(静态初始化)或懒汉式(双检锁...

    面试题java

    在Java中,`switch`语句可以作用于`byte`、`short`、`char`、`int`类型,也可以作用于枚举类型和字符串(从Java 7开始)。 #### 第三十二题:Singleton模式的实现 Singleton模式确保一个类只有一个实例,并提供一...

    java面试常问的问题

    32. **Singleton模式**:确保一个类只有一个实例,通常通过私有构造器和静态工厂方法实现。 以上是对Java面试中常见问题的详细解答,涵盖了语言基础、集合、并发、异常处理、设计模式等多个方面。掌握这些知识点...

    JAVA程序员面试时32个问题

    23. 构造器不能被 override,因为构造器具有与类相同的名称,且不能有返回类型。 24. 不能直接继承 String 类,因为String是final的。 25. 当一个线程进入synchronized方法后,其他线程无法进入该对象的其他...

    day020-继承加强和设计模式代码和笔记.rar

    即当前类所在路径及其引用的第三方类库的路径,如第四节中的问题6所述)下的类库 加载到内存中。 开发者可以直接使用系统类加载器。 5. 设计模式:(框架中使用,是程序设计的高级思想) 1. 单例模式...

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    Java程序员常见笔试题

    构造器不能被重写,因为构造器是特殊的方法,用于初始化对象,不存在继承关系中的重写概念。 #### 二十五、String类是否可被继承 `String`类是final的,因此不能被继承。 #### 二十六、线程与synchronized方法 ...

    黑马程序员入学Java知识

    - 使用`Integer.parseInt()`等方法将字符串转换为基本类型。 4. **Object类** - 所有类的父类。 - 定义了一些公共方法,如`toString()`、`equals()`等。 5. **代码块** - 用于初始化对象的代码块。 - 构造...

Global site tag (gtag.js) - Google Analytics