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

时间:2016-08-22 11:55:00

标签: java private-constructor final-class

我最近经历了Netflix open source project

之一

在那里我发现了最终类和私有构造函数的使用。我完全清楚

  1. 最终是为了避免继承
  2. 私人是禁止实例化
  3. 但我很想知道为什么它们一起使用。虽然方法是静态的,但我们可以在没有实例化的情况下使用它们,但仍然渴望了解它背后的设计原理。

2 个答案:

答案 0 :(得分:5)

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

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

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

StaticFinalClassExample.methodYouWantToCall();

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

/**
 * This class consists exclusively of static methods that help verify the compliance of OP1A-conformant....
 */

//to prevent instantiation
private IMFConstraints()
{}

ADD ON:

如果您想了解更多信息,请查看Joshua Bloch's Effective Java (2nd Edition)中的Item 4

  

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

     

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

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

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

     

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

     

然而,有一个简单的习惯用法来确保不可修复性。仅当类不包含显式构造函数时,才会生成默认构造函数,因此可以通过包含私有构造函数使类不可实现。

答案 1 :(得分:0)

该类由static所谓的“实用程序”方法组成,因此您不需要它的实例,而且,尝试获取它的实例是错误的。该类是最终的,因此客户端开发人员无法选择并扩展该类,因为这将违背原始类的意图。

私有构造函数基本上有两种用法:在要限制创建的类的情况下严格控制实例化(例如,如果它需要大量资源)。在第一种情况下,您必须提供为客户端创建对象的static工厂方法。 即:

public static IMFConstraints getInstance()

另一种情况是,如果从不有效制作实例。在这种情况下,您提供static方法,这些方法在类本身上调用。即:

public static void checkIMFCompliance(List<PartitionPack> partitionPacks)

您可以这样调用上述方法:

// your cool client code here...
IMFConstraints.checkIMFCompliance(myPartitionPacks);
// more of your awesome code...

您关联的课程是后一种情况。