繁体   English   中英

它是强制性的实用程序类,应该是最终的私有构造函数吗?

[英]Is it mandatory utility class should be final and private constructor?

通过使用私有构造函数,我们可以避免在外部的任何地方实例化类。 通过将班级定为最终班级,其他任何班级都无法对其进行扩展。 为什么Util类必须具有private构造函数和final类?

从功能的角度或Java复杂性或运行时来看,这不是强制性的。 但是,其编码标准已为更广泛的社区所接受。 甚至很多静态代码查看工具(如checkstyle)和许多其他工具都检查此类遵循了这种约定。

为什么遵循该约定,已经在其他答案中进行了解释,甚至OP都对此进行了说明。

我想进一步解释一下,大多数Utility类具有与对象实例无关的方法/函数。 这些是聚合函数,因为它们仅依赖于返回值的参数,而不与实用程序类的类变量相关联。 因此,大多数这些功能/方法保持静态。 因此,实用程序类最好是所有静态方法的类。 因此,任何调用这些方法的程序员都无需实例化此类。 但是,某些自动编码器(可能经验不足或兴趣不足)会倾向于创建对象,因为他们认为在调用其方法之前需要这样做。 为了避免创建该对象,我们有3种选择:-

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

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

总之,创建实用程序类的对象没有任何意义。 因此,构造函数应该是私有的。 而且您永远都不想覆盖它,因此将其标记为最终的。

没必要,但是很方便。 实用程序类只是相关功能的名称空间持有者,并不意味着要实例化或子类化。 因此,防止实例化和扩展会向该类的用户发送正确的消息。

Java语言和Java运行时之间有一个重要的区别。

将java类编译为字节码时,没有访问限制的概念, publicpackageprotectedprivate等效。 总是可以通过反射或字节码操作来调用private构造函数,因此jvm无法依赖该功能。

另一方面, final是一直存在到字节码中的东西,它提供的保证可以被javac用来生成更有效的字节码,而jvm可以用来生成更有效的机器指令。

启用的大多数优化不再相关,因为jvm现在将相同的优化应用于在运行时是单态的所有类,而这些优化始终是最重要的。

默认情况下,此类通常用于聚合执行不同操作的函数,在这种情况下,我们无需创建新对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM