是强制实用类应该是final和private构造函数吗?

Sub*_*shi 9 java coding-style final private

通过创建私有构造函数,我们可以避免从外部的任何地方实例化类.通过使类最终,没有其他类可以扩展它.为什么Util类需要private构造函数和final类?

Pan*_*her 10

从功能的角度来看,这不是一个任务,也不是Java复杂或运行时.但是,其编码标准被更广泛的社区所接受.甚至许多静态代码审查工具(如checkstyle和许多其他工具)都会检查这些类是否遵循此类规定.

为什么遵循这一惯例,已在其他答案中解释,甚至OP也涵盖了这一点.

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

  1. 继续教育人们不要实例化它.(没有理智的人可以继续这样做.)
  2. 将类标记为抽象: - 再次现在robo-coders将不会创建对象.然而,审查和更广泛的Java社区将争辩说,标记抽象意味着你希望有人扩展它.所以,这也不是一个好选择.
  3. 私有构造函数: - Protected将再次允许子类创建对象.

现在,再次如果有人想为这些实用程序类添加一些功能的新方法,他不需要扩展它,他可以添加新方法,因为每个方法都是独立的,没有机会破坏其他功能.所以,不需要覆盖它.而且你也不会去实现,所以需要继承它.最好将其标记为最终.

总之,创建实用程序类的对象没有意义.因此构造函数应该是私有的.而你永远不想覆盖它,所以最后标记它.


Mar*_*nik 6

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

  • 祝贺100k :) (2认同)