Java 最佳实践:仅使用静态方法的类

2022-08-31 17:35:32

我有一个应用程序,其中有一个名为 .此类只有静态方法,如 或 。我在 GUI 类中使用它们来检查输入,然后再将其发送到下层。PlausibilityCheckercheckZipcodeFormatcheckMailFormat

这是好的做法吗?我想我应该只使用静态方法,这样我就不必关心将实例传递给GUI类,或者在每个gui类中都有一个不引用gui对象的实例字段。

我注意到 该类只有静态方法,因此我认为这不会是那么可怕的错误。FilesJava NIO


答案 1

我会说你做对了。除此之外,对你的效用类的一些建议:

  • 确保它没有任何状态。也就是说,除非声明 ,否则类中没有字段。此外,请确保此字段也是不可变的,例如 s。static finalString
  • 确保它不能是其他类的超类。使该类成为其他程序员无法扩展它。final
  • 这个是有争议的,但你可以声明一个 no-arg 构造函数 ,所以没有其他类可以创建你的效用类的实例(使用反射或类似的东西就可以了,但没有必要对类进行保护)。为什么你不能这样做?嗯,这是一个奇怪的情况,你想要/需要注入一个实用程序类的实例,例如通过一个接口,而不是直接在你的类中使用它。这是一个例子。这种设计确实很奇怪,但可能会发生(如上面的链接所示),但是如果您在这种情况下不会运行,最好的建议是保留构造函数 。privateprivate

有很多库提供实用程序类,以帮助我们程序员完成工作。其中最着名的是Apache Common库集。它是开源的,您可以检查代码以查看他们如何设计这些实用程序类以创建您的实用程序类。(免责声明:我不工作或支持这些库,我是它们的快乐用户)

重要说明:避免对实用程序类使用单例


答案 2

在 Java 8 中,您现在可以将静态实用程序类更改为具有静态实现的接口。这消除了使类成为最终类的需要,并且必须提供私有构造函数。这就像将“class”更改为“interface”并删除最终单词(所有接口都是抽象的,因此它们不可能是最终的)一样简单。由于接口方法始终是公共的,因此您可以从中删除任何公共范围。如果你有一个私有构造函数,那么也删除它(你不能用构造函数编译接口,因为它们不能被实例化)。它的代码更少,看起来更干净。您不必重构任何已使用它的类。


推荐