如果我必须设计一个Utility类(例如ByteUtils或StreamUtils或StringUtils),那么它们的最佳设计选择是什么.
PS:通过静态类,我的意思是一个带有静态方法的类(而不是内部静态类)
请就此设计选择提出建议?
JB *_*zet 63
我的实用程序类看起来像这样:
// 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() {
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,尽管这使得实用程序方法易于测试,并且可以从外部轻松访问,但它也使得使用它们的类难以进行单元测试,因为模拟这些实用程序方法并不容易.有太多这样的实用程序类可能是缺乏OO设计(程序编程)的标志,并且可能真的使代码难以测试.
如果您正在使用依赖注入框架(Spring,Guice,无论如何),那么使用非静态方法使实用程序类可实例化并使其成为可注入的单例可能是个好主意.这样,可以通过模拟实用程序对象来测试使用这些实用程序方法的类.
Gap*_*ton 45
如果它是一个通用的实用程序,静态是IMO更好.你声明你不会有任何州存储,所以我不明白你为什么要把它作为非静态的.声明它是静态的也会节省内存.
小智 24
仅仅因为某些东西可以是静态的,并不意味着它应该是静态的.
所有这一切都有另一个考虑因素:嘲弄.在测试中模拟静态方法比模拟类实例的行为更困难.
谈论不必要的堆分配和对象的GCing对我来说过早优化.JVM在优化这类问题方面做得非常好.
定义Utility类的最简单方法是作为没有实例的枚举
public enum Utility {;
public static int utilityMethod(int x) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
实用程序类不应该具有任何状态或具有最小状态,因此您不应该担心GC.
您可以将其他有状态类用于特定目的,例如Builder,Factory,您可以根据需要创建对象,并在完成后将其丢弃.
归档时间: |
|
查看次数: |
41647 次 |
最近记录: |