私有构造方法强制不可实例化的性质

简介: 私有构造方法强制不可实例化的性质

有时想编写只有静态方法和静态字段的类。这种类很不好,因为有些人滥用在OOP 语言编写面向过程的程序,但确有用途。

可用 java.lang.Math 或 java.util.Arrays 这种类,把基本类型的值或数组类型的方法组织起来。

还可以用于对以 java.util.Collections 的方式,把实现特定接口的对象上的静态方法组织起来。( Java 8,可以将这些方法放入接口中,假设是你自己编写的可以修改)。最后,这些类还可把 final 类上的方法组织,因为不能将它们放在子类。


这样的工具类不是为实例化而设计:实例毫无意义。然而没有显式构造方法时,编译器会提供无参默认构造方法。对用户来说,这个构造方法与其他构造方法没区别。在已发布的 API 中看到无意中实例化的类很常见。


通过使类抽象来强制不可实例化是行不通的。 该类可被子类化,进而实例化子类。还会误导用户认为类是为继承而设计的。

然而,有一个简单的操作确保不可实例化。只有当类不包含显式构造方法时,才会生成默认构造方法,因此可以通过包含私有构造方法使类不可实例化:


image.png


因显式构造方法私有,在类外不可访问。AssertionError 不是严格要求的,但提供了保障,以防构造方法意外地被调用(比如反射!)。保证类在任何情况下都不会被实例化。

这个习惯用法有点违反常规,因为构造方法是明确提供的,但却不能调用它。因此,通常加个注释说明就是很好的做法。


也防止了类被子类化,这算是一个副作用吧。

所有子类构造方法都必须调用超类构造方法,无论是显式的还是隐式的,但这种情况下子类却没有可访问的超类构造方法可调用。


目录
相关文章
|
10月前
|
存储 编译器 程序员
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
【C++】类与对象(一)类的定义 访问限定符 类的实例化 this指针
|
1月前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
59 4
|
4月前
静态方法 普通方法 和 构造方法三者的区别
静态方法 普通方法 和 构造方法三者的区别
91 0
|
10月前
|
编译器 C++
44 C++ - 继承中的构造和析构
44 C++ - 继承中的构造和析构
40 0
继承中的构造与析构
继承中的构造与析构
65 0
学生类-构造函数
学生类-构造函数
152 0
|
Java
JAVA:私有成员变量的调用 与 构造函数私有化 、构造函数保持成员变量私有性
私有成员变量的调用 与 构造函数私有化 、构造函数保持成员变量私有性的介绍
509 0
JAVA:私有成员变量的调用 与 构造函数私有化 、构造函数保持成员变量私有性
|
C++ 小程序
c++类的实例化,有没有new的区别
A a; A * a = new a(); 以上两种方式皆可实现类的实例化,有new的区别在于: 1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可控性增强。
1220 0
类初始列表和类对象作为类成员
类初始列表和类对象作为类成员
类初始列表和类对象作为类成员
|
数据安全/隐私保护 C++
C++类中数据成员要私有
C++类中数据成员要私有
271 0