它是否强制效用类应该是最终的私有构造函数?

2022-09-03 05:45:16

通过创建私有构造函数,我们可以避免从外部的任何位置实例化类。并且通过使类成为最终类,没有其他类可以扩展它。为什么 Util 类必须具有构造函数和类?privatefinal


答案 1

从功能或java复杂性或运行时的角度来看,这不是一个命令。然而,它的编码标准被更广泛的社区所接受。甚至许多静态代码审查工具(如checkstyle和许多其他工具)也会检查这些类是否遵循了这种规范。

为什么遵循这个约定,已经在其他答案中解释过了,甚至OP也涵盖了这一点。

我喜欢进一步解释它,大多数效用类都有独立于对象实例的方法/函数。这些是聚合函数。因为它们仅依赖于返回值的参数,而不与实用程序类的类变量相关联。因此,大多数情况下,这些函数/方法都是静态的。因此,理想情况下,实用工具类是具有所有静态方法的类。因此,任何调用这些方法的程序员都不需要实例化此类。但是,一些机器人编码人员(可能经验或兴趣较少)倾向于在调用其方法之前创建他们认为需要的对象。为了避免创建对象,我们有3个选项:-

  1. 继续教育人们不要实例化它。(没有一个理智的人可以继续这样做。
  2. 将类标记为抽象:- 现在机器人编码人员不会创建对象。然而,评论和更广泛的java社区会争辩说,标记抽象意味着你希望有人扩展它。因此,这也不是一个好的选择。
  3. 私有构造函数 :- 受保护将再次允许子类创建对象。

现在,如果有人想为这些实用程序类添加某些功能的新方法,他不需要扩展它,他可以添加新方法,因为每个方法都是独立的,并且没有机会破坏其他功能。因此,无需覆盖它。而且你也不会插入,所以需要对它进行子类化。最好将其标记为最终版本。

总而言之,创建效用类的对象是没有意义的。因此,构造函数应该是私有的。而且你永远不想覆盖它,所以把它标记为最终。


答案 2

这不是必需的,但很方便。实用工具类只是相关函数的命名空间持有者,并不意味着要实例化或子类化。因此,阻止实例化和扩展会向类的用户发送正确的消息。