【发布时间】:2011-07-10 15:58:59
【问题描述】:
创建静态实用程序类有什么缺点?我做得越多,我就越觉得它们非常有用。我知道他们缺乏面向对象的设计,但我仍然可能比我应该更爱他们。使用它们还有其他缺点吗?
【问题讨论】:
-
虽然这与 Java 有关,但您可以在 stackoverflow.com/questions/1333690/… 中查看有关 C# 的类似问题
创建静态实用程序类有什么缺点?我做得越多,我就越觉得它们非常有用。我知道他们缺乏面向对象的设计,但我仍然可能比我应该更爱他们。使用它们还有其他缺点吗?
【问题讨论】:
在正确的上下文中,它们没有任何问题。如果您有独立的、无状态的方法(例如在java.lang.Math 中找到的方法),那么静态类是它们的理想场所。它们在一个类中的唯一原因是因为 Java 没有独立方法的概念。
【讨论】:
IMO 的主要缺点是无法使用大多数模拟框架来模拟此类实用方法的实现,以便使用这些实用方法对某些类进行单元测试。
例如,使用System.currentTimeMillis() 很容易得到当前时间。但是当你必须测试一个使用当前时间做一些工作的类时,不可能模拟该方法以使其返回特定的时间点。使用实现Clock 接口的对象并将其注入到对象中进行测试会更容易:您可以创建一个模拟时钟实现,在被要求获取当前时间时返回特定日期。
【讨论】:
currentTimeMillis() 方法确实如此。但就像@Oli Charlesworth 所说,Math api 将一成不变。
cos 调用结果,会发生什么情况?
我之前在一篇帖子中谈到过这个问题,你可以找到here。
使用静态方法的主要问题是:
但是,如果方法本身不太麻烦并且几乎可以预测(即对实现的不同变体等没有太多要求),那么静态方法没有理由不符合要求。所以,这个故事的寓意是使用它,但要注意副作用。
【讨论】: