专栏首页MyBlogEffective.Java 读书笔记(4)非实例化

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 条评论
登录 后参与评论

相关文章

  • Effective.Java 读书笔记(6)内存泄漏

    当你使用直接操作内存的语言,例如C或者C++的时候,一些内存释放的操作会比较麻烦,而我们使用java这一种拥有垃圾回收机制的语言的时候,这份工作就变得轻松多了,...

    Mezereon
  • Effective.Java 读书笔记(2)使用Builder

    静态工厂和构造器都有一个限制,它们不能够很好地缩减大量地选项参数,想象一下一种情况,你的类有着很多的成员变量,有些必须填写有些可以选填,那么如果使用传统的构造方...

    Mezereon
  • 关于Socket的解析以及双方通讯的java实现

    在Java编程之中,我们通常都会接触到网络编程,那么不可避免地就会接触到Socket通信,下面我将对Socket进行简单的解析,并给出双方通讯的代码实现方案

    Mezereon
  • 面试题36(关于构造方法的的理解?)

    下面关于构造方法的说法不正确的是? A 构造方法也属于类的方法,用于创建对象的时候给成员变量赋值 B 构造方法不可以重载 C 构造方法没有返回值 D 构造方法一...

    Java学习
  • java练习本(2019-06-03)

    “We are what we repeatedly do; excellence, then, is not an act but a habit.”

    微笑的小小刀
  • Swift专题讲解十五——类型构造 原

            构造是类、结构体、枚举在实例化中必须执行的过程,在构造过程中,类、结构体必须完成其中存储属性的构造。Swift中的构造通过构造方法来完成,和Ob...

    珲少
  • 【Servicemesh系列】【Envoy源码解析(三)】一个Http请求到响应的全链路(二)

    上一章节讲到了FilterManager通过对Read Filter进行流程拼装,以下接着以最核心的路由功能为例,来串联整个请求发送的流程。

    吃橙子的狐狸
  • Swift中构造方法的解析 原

          构造方法是一个类创建对象最先也是必须调用的方法,在Objective-C中,开发者更习惯称这类方法为初始化方法。在Objective-C中的初始化方...

    珲少
  • JAVA学习笔记(一)

    JDK :给Java开发人员使用的工具包,包括Java的开发工具,也包括JRE。其中开发工具中包括编译工具(javac.exe)、运行工具(java.exe)、...

    HUC思梦
  • Pytorch深度学习

    这里有一份干货教程,手把手带你入门深度强化学习(Deep Reiforcement Learning),背景理论、代码实现全都有,在线领取无需安装哟!

    商业新知

扫码关注云+社区

领取腾讯云代金券