具有私有构造函数的最终类,设计原则是什么

Sud*_*ip7 8 java private-constructor final-class

我最近正在浏览一个 Netflix开源项目

在那里,我发现使用最终类和私有构造函数.我完全清楚这一点

  1. 最后是避免继承
  2. 私人是禁止实例化

但我很想知道为什么它们一起使用.虽然方法是静态的,但我们可以在没有实例化的情况下使用它们,但仍然渴望了解它背后的设计原理.

Jor*_*lla 6

使用此代码,您将拥有此功能

  • 不允许任何子类(extends)你的类
  • 不允许实例化您的类
  • 最后创建一个变量或类可以提高性能(不是很多,但它确实并且在大型项目中作为常见做法会有所作为)

在这种情况下,我无法看到单例模式来获取实例,因此,IHMO您正在寻找Netflix API中的helper/util类,其中开发人员团队使用一些标准实践来确保用户在其中使用他们的类.正确方法:

StaticFinalClassExample.methodYouWantToCall();
Run Code Online (Sandbox Code Playgroud)

另外,看看你链接的课程:

/**
 * This class consists exclusively of static methods that help verify the compliance of OP1A-conformant....
 */
Run Code Online (Sandbox Code Playgroud)

和:

//to prevent instantiation
private IMFConstraints()
{}
Run Code Online (Sandbox Code Playgroud)

添加在:

如果您想了解更多信息,看一看,以Item 4约书亚Bloch的Effective Java的(第2版):

第4项:使用私有构造函数强制实现非实例化

有时你会想要编写一个只是一组静态方法和静态字段的类.这些课程的声誉很差,因为有些人滥用它们以避免在对象方面进行思考,但它们确实具有有效用途.

  • 它们可以被用来对原始值或阵列组相关的方法,在该方式java.lang.Mathjava.util.Arrays.
  • 它们还可以用于对实现特定接口的对象的静态方法(包括工厂方法(第1项))进行分组java.util.Collections.
  • 最后,它们可用于对final类进行分组,而不是扩展类.

这样的实用程序类不是为了实例化而设计的:实例是荒谬的.但是,在没有显式构造函数的情况下,编译器提供了一个公共的无参数默认构造函数.对于用户来说,这个构造函数与其他构造函数无法区分.在已发布的API中看到无意中可实例化的类并不罕见.

尝试通过使类抽象来强制执行非实例化不起作用.该类可以是子类,子类实例化.此外,它误导用户认为该类是为继承而设计的(第17项).

但是,有一个简单的习惯用法可以确保不具备实用性.仅当类不包含显式构造函数时,才会生成默认构造函数,因此可以通过包含私有构造函数使类不可实现.