Effective.Java 读书笔记(4)非实例化

4.Enforce noninstantiability with private constructor

大意为 使用private的构造方法来实现的非实例化

有时你想要编写一个类,这个类只是静态方法和静态域的组成,这样的一个类获得一个糟糕的名声因为一些人滥用他们为了避免对对象的术语进行思考,但是他们的确是有用的

他们可以被使用在原始的值或者数组上组合有关的方法,比如在java.lang.Math或者java.util.Arrays上的方式,他们也可以被用来组合静态方法,包括工厂方法,对于实现了一个特定接口的对象,比如在Collections上的方式,最后他们可以被用来在final类上组合方法而不用继承其他类。

这样的工具类不会被设计成可以被初始化的类,一个实例是没有意义的,显式的构造方法没有必要出现,然而,编译器提供了一个public,无参的默认的构造方法,对于用户来说,这个构造方法是和其他的构造方法是不可区分的,在公开的API中见到无意的可初始化类也是常事

为了非实例化,使一个类抽象并没有什么作用,这个类可以被子类化,并且子类可以被实例化,而且,它会误导用户去认为这个类是设计来继承的,那么如何实现非实例化呢,很简单,我们知道默认的构造方法只会在没有其他冲突的构造方法的情况下才会自动生成,所以一个类只需包括一个private的构造方法就可以实现非实例化

// Noninstantiable utility class
public class UtilityClass {
// Suppress default constructor for noninstantiability
  private UtilityClass() {
     throw new AssertionError();
  }
... // Remainder omitted
}

因为这个构造方法是private的,所以在类的外部不可以被访问,AssertionError并不是严格需要的,但是它提供了构造器意外构造时的保险,它保证了这个类不会在任何情况下被实例化

另一方面,这个类也不可以被子类化。所有的构造方法必需调用父类的构造方法,显地式的或者隐式地调用,一个子类并没有父类可行的构造方法可以去调用

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术专栏

python3入门与实践(六):函数式编程

一定程度下lambda可以替换命令式编程的函数,reduce可以替换命令式编程的循环

1001
来自专栏PHP实战技术

解构赋值,你不能不懂!

14510
来自专栏十月梦想

ES6数组遍历之forEach,map和filter

在之前我们需要去循环数组,通常使用的是for循环,去循环数组的下标,而在ES6中提供了一种新的方式进行遍历数组!在看这个之前我们先对比一下之前的遍历方式!

1.9K2
来自专栏云霄雨霁

排序----堆排序

1500
来自专栏布尔

想起温习一下JS中的this apply call arguments

很多时候讲到语言入门,大家会认为就是要了解一下语言的语法、数据类型和常用函数。这一课对于所有的计算机专业的毕业生来说都可以自学,然而在最近的实践中(带了两个实习...

21310
来自专栏大数据钻研

Java到底是不是一种纯面向对象语言?

Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。 在我刚开始学习 Java 的前面几年,我从书本里知道了 Java 是遵循 ...

28811
来自专栏编程坑太多

js数组、json、js对象的区别与联系

1984
来自专栏北京马哥教育

从Zero到Hero,一文掌握Python关键代码

本文整体梳理了 Python 的基本语法与使用方法,并重点介绍了对机器学习十分重要且常见的语法,如基本的条件、循环语句,基本的列表和字典等数据结构,此外还介绍...

2997
来自专栏老九学堂

【学习】Java微课堂之for循环

主要知识点 ? ? for循环注意要点 本讲视频中讲了for循环的要点以及三大循环的区别,主要笔记如下: 1.for循环是循环控制结构中使用最广泛的一种循环控制...

3216
来自专栏liulun

Nim教程【十】

openarray类型 注意:openarray类型只能用于参数 固定大小的数组虽然性能不错,但过于呆板,使用取来不是很方便 对于一个方法来说,传入参数如果是一...

2728

扫码关注云+社区