通过创建私有构造函数,我们可以避免从外部的任何地方实例化类。通过使类最终,没有其他类可以扩展它。为什么Util类需要private
构造函数和final
类?
答案 0 :(得分:9)
这不是从功能角度或java复杂性或运行时的授权。但是,其编码标准被更广泛的社区所接受。甚至许多静态代码审查工具,如checkstyle和许多其他人都会检查这些类是否遵守了这一规定。
为什么遵循这一惯例,已在其他答案中解释,甚至OP也涵盖了这一点。
我想进一步解释一下,大多数Utility类都有与对象实例无关的方法/函数。这些是聚合函数。因为它们仅依赖于返回值的参数而不依赖于实用程序类的类变量。因此,大多数这些函数/方法都是静态的。因此,Utility类理想地是具有所有静态方法的类。 因此,任何调用这些方法的程序员都不需要实例化这个类。然而,一些机器人编码器(可能没有经验或兴趣)将倾向于在调用其方法之前创建他们认为需要的对象。为了避免创建对象,我们有3个选项: -
现在,如果有人想为这些实用程序类添加一些新功能的方法,他不需要扩展它,他可以添加新方法,因为每个方法都是独立的,没有机会破坏其他功能。所以,不需要覆盖它。而且你也不会去见,所以需要继承它。最好将它标记为最终。
总之,创建实用程序类的对象没有意义。因此构造函数应该是私有的。而你永远不想覆盖它,所以最后标记它。
答案 1 :(得分:6)
没必要,但很方便。实用程序类只是相关函数的命名空间持有者,并不意味着实例化或子类化。因此,防止实例化和扩展会向类的用户发送正确的消息。
答案 2 :(得分:0)
Java语言和Java运行时之间存在重要区别。
当java类编译为字节码时,没有访问限制的概念,public
,package
,protected
,private
是等效的。通过反射或字节码操作总是可以调用private
构造函数,因此jvm不能依赖于该能力。
final
是持续存在于字节码中的东西,javac可以使用它提供的保证来生成更高效的字节码,并通过jvm生成更高效的机器指令。 / p>
这个启用的大多数优化都不再相关,因为jvm现在对所有在运行时单态的类应用相同的优化 - 这些始终是最重要的。
答案 3 :(得分:-1)
默认情况下,这种类通常用于聚合不同的函数,在这种情况下我们不需要创建新对象