`

Effective Java (4) - 通过私有构造器强化不可实例化的能力

 
阅读更多

一、背景

对于有些工具类如java.lang.Math、java.util.Arrays等,它们只包含静态方法和静态域字段,对于这样的类实例化没有什么任何意义。但在实际使用中,如果不加任何特殊处理,这样的类还是可以像其他类一样可以被实例化。


二、处理办法

将构造函数设置为private,这样外部类无法实例化该类,同时在这个私有的构造函数中直接抛出异常,从而避免在类的内部实例化。

public class UtilityClass {
	// 私有的构造器,内部实例化会抛出异常
	private UtilityClass() {
		throw new AssertionError();
	}
}

三、好处和弊端

这样定义之后,类在内部和外部都不能被实例化了,否则会发生编译错误或抛出异常,但副作用是这个类将不能被子类化了。



分享到:
评论

相关推荐

    ihukaijun#effective-java-3rd-chinese#04. 使用私有构造方法执行非实例化1

    只有当类不包含显式构造器时,才会生成一个默认构造器,因此可以通过包含一个私有构造器来实现类的非实例化:public class UtilityClass {..

    effective-java.pdf

    - 不可实例化:当类设计为工具类,不希望有实例存在时,可以使用私有构造器来防止外部实例化。 - 不可变值类:使用预先构建的实例或构造时缓存实例,确保不会创建重复对象。 4. 基于接口的框架:通过接口提供静态...

    《Effective Java》读书分享.pptx

    通过私有构造器强化不可实例化的能力,可以防止工具类被实例化。 Builder 模式 Builder 模式是一种构建对象的方法,不直接生成想要的对象,而是利用必要参数调用构造器(或者静态工厂)得到一个 builder 对象,...

    Effective Java第三版1

    4. **强化不可实例化的能力**:对于工具类或只包含静态方法的类,通过使构造器私有,可以防止其被实例化。 5. **依赖注入**:优于硬编码资源连接,依赖注入可以提高代码的可测试性和灵活性。 6. **避免创建不必要的...

    Effective-Java读书笔记(上)

    **通过私有构造器强化不可实例化的类**: - **工具类**:通常,工具类应包含私有构造器以防止被实例化。 - **副作用**:使用私有构造器的一个副作用是使得该类不能被继承。 **避免创建不必要的对象**: 1. **不可...

    effective java 读书笔记

    - Item4:如果一个类不应当被实例化,使用私有构造子并配合`final`关键字使其成为不可初始化的常量类。 2. **避免产生不必要的对象** - Item5:尽量重用对象,特别是对于不可变对象,如字符串,它们在常量池中会...

    Effective-Java读书笔记

    7. **使用私有构造器或枚举来禁止实例化**:对于工具类(只包含静态方法的类),应阻止外界实例化,可以使用私有构造器或枚举实现这一目标。 8. **利用接口隐藏实现细节**:通过定义接口并让实现类实现该接口,可以...

    java优秀源码-Effective-Java-Concepts:Java源代码可以强化概念,我正在从JoshuaBloch的出色著作“Eff

    6. **构造器**:Item 1 "提供私有的构造器来创建不可实例化的类" 和 Item 2 "如果可能,应该使类及其字段不可变" 都涉及到类的设计和初始化策略。 7. **泛型**:Item 25 "尽可能地使用类型参数" 介绍了泛型在代码...

    effectiveJava的笔记

    2. **构造器与工厂方法**:提倡使用私有构造器和静态工厂方法,以便于控制类的实例化过程,提高代码灵活性,例如实现不可变对象、延迟初始化等。 3. **接口与抽象类**:讨论了接口和抽象类在设计上的差异,强调接口...

    Effective-Java:Effective Java中文版第二版示例代码

    2. **构造器**:推荐使用私有构造器或静态工厂方法来限制类的实例化,以实现不可变类或者控制对象的创建。此外,还强调了构造器不应抛出检查异常。 3. **枚举**:枚举在Java中不仅仅是常量集合,还可以包含方法,...

    Effective-java-3e-source-code:有效Java第三版的源代码,并进行了必要的补充以使其可运行

    还有许多其他的知识点,如“利用equals()和hashCode()的一致性”、“重写clone()需谨慎”、“优先使用私有构造器或枚举来替代单例”等,都可以在源代码中找到实际应用的例子。 总之,《有效Java》第三版的源代码为...

    java源码总结-Effective-Java-3E:有效Java第三版的源代码示例和摘要的回购

    3. **构造器(Constructors)**:提倡使用私有构造器和工厂方法,以实现不可实例化类或者控制实例化过程。此外,还讨论了如何利用构造器初始化器来优化对象初始化。 4. **静态工厂方法(Static Factory Methods)**...

    Effective.Java3rd.zip

    14. **使用私有构造器或final类来阻止实例化**:对于工具类或者单例模式,这样做可以防止外部非法实例化。 15. **避免非最终字段的同步**:非最终字段在多线程环境中可能导致数据不一致,应优先考虑使用原子变量或...

    Java-Effective:Java Effective 2nd Edition书中的源代码

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,第二版更是程序员们不可或缺的参考书籍。这本书深入探讨了如何编写出高质量、高效、可维护的Java代码,涵盖了众多最佳实践和设计模式。这里我们将...

    Effecctive java 中文版

    11. **项11:用私有构造器或枚举类型强化单例属性** 单例模式应防止多线程环境下的并发创建,私有构造器和枚举类型是实现单例的推荐方式。 12. **项12:谨慎地覆盖equals()和hashCode()** 当重写equals()时,也应...

    Effictive Java

    ##### Item3:通过私有构造器强制执行不可实例化 - **目的**:防止类被实例化,通常适用于工具类等不需要实例化的场景。 - **实现方式**: - 将构造器声明为私有,从而阻止外部直接创建实例。 ##### Item4:避免...

    EffectiveJava

    13. **使用私有构造器或枚举来防止被实例化**:对于工具类,可以防止误用和确保其不可实例化。 14. **使用Diamond操作符简化泛型实例化**:Java 7引入了Diamond操作符,可以自动推断出类型参数,使代码更简洁。 15...

Global site tag (gtag.js) - Google Analytics