java 它是强制性的工具类应该是最终的和私有的构造函数吗?

k5hmc34c  于 2023-01-07  发布在  Java
关注(0)|答案(4)|浏览(237)

通过创建私有构造函数,我们可以避免从外部的任何地方示例化类。并且通过创建final类,其他类不能扩展它。为什么Util类必须有private构造函数和final类?

pcww981p

pcww981p1#

这不是从功能Angular 或java复杂性或运行时的要求,而是被更广泛社区接受的编码标准,甚至大多数静态代码审查工具,如checkstyle,都会检查此类类是否遵循了这一约定。
为什么要遵循这个约定在其他答案中已经解释过了,甚至OP也提到了,但是我想进一步解释一下。
大多数实用程序类是独立于对象示例的方法/函数的集合。它们有点像聚合函数,因为它们只依赖于返回值的参数,而不与实用程序类的类变量相关联。因此,这些函数/方法大多保持静态。因此,实用程序类在理想情况下是只具有静态方法的类。因此,任何调用这些方法的程序员都不需要示例化类。然而,一些机器人程序员(可能缺乏经验或兴趣)倾向于在调用方法之前创建他们认为需要的对象。为了避免这种情况,我们有3个选择:
1.继续教育人们不要把它示例化(没有一个理智的人能一直这样做)。
1.将实用程序类标记为抽象:现在机器人程序员不会创建对象了,但是评论家和更广泛的java社区会争论说,把类标记为抽象意味着你“希望”有人来扩展它,所以,这也不是一个好的选择。
1.私有构造函数:不受保护,因为它允许子类示例化对象。
现在,如果有人想为实用程序类的某些功能添加一个新方法,他们不需要扩展它:他们可以添加一个新的方法,因为每个方法都是独立的,并且没有机会破坏其他功能。2所以,不需要重写它。3同样,你不打算示例化它,所以不需要子类化它。4最好把它标记为final。
总而言之,示例化一个实用类(new MyUtilityClass())是没有意义的。因此构造函数应该是私有的。而且你永远不想覆盖或扩展它,所以把它标记为final。

mqkwyuun

mqkwyuun2#

这不是必须的,但是很方便。实用类只是相关函数的名称空间保持器,并不意味着要被示例化或子类化。因此,阻止示例化和扩展向类的用户发送了正确的消息。

up9lanfz

up9lanfz3#

Java语言和Java运行时之间有一个重要的区别。
当java类被编译成字节码时,没有访问限制的概念,publicpackageprotectedprivate是等价的,总是可以通过反射或者字节码操作来调用private构造函数,所以jvm不能依赖那个能力。
另一方面,final是一直持续到字节码的东西,并且它提供的保证可以被JavaC用来生成更有效的字节码,并且被JVM用来生成更有效的机器指令。
大多数这样的优化已经不再适用,因为jvm现在对所有运行时单态的类都应用了相同的优化而这些总是最重要的。

7y4bm7vi

7y4bm7vi4#

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

相关问题