实用程序类应该是静态的吗?[已关闭]

2022-08-31 12:29:14

如果我必须设计一个实用程序类(例如ByteUtils或StreamUtils或StringUtils),那么最适合它们的设计选择是什么。

  • 它们应该是静态类(因为我没有任何状态要存储)
  • 如果它们是非静态类(因此,如果不使用对象,它们将被gc'd)

PS:通过静态类,我指的是具有静态方法的类(而不是内部静态类)

请就此设计选择提供建议?


答案 1

我的实用程序类如下所示:

// final, because it's not supposed to be subclassed
public final class FooUtil {

    // private constructor to avoid unnecessary instantiation of the class
    private FooUtil() {
    }

    public static int doSomethingUseful() {
    }

    // ...
}

请注意,尽管这使得实用工具方法易于测试,并且易于从外部访问,但它也使使用它们的类难以进行单元测试,因为模拟这些实用工具方法并不容易。拥有太多这样的实用程序类可能是缺乏OO设计(过程编程)的迹象,并且确实会使代码难以测试。

如果您使用的是依赖注入框架(Spring,Guice等),那么使用非静态方法使实用程序类可实例化并使其成为可注入的单例可能是一个好主意。这样,可以通过模拟实用程序对象来测试使用这些实用程序方法的类。


答案 2

如果它是通用实用程序,则静态是IMO更好的。你说你不会有任何状态来存储,所以我不明白为什么你应该让它成为非静态的。将其声明为静态也将节省内存。


推荐