应该是单身人士,静态还是普通班级?

时间:2015-08-05 06:47:13

标签: java

考虑一个名为Effects的类,其中静态 ArrayList名为effects
该类包含一些在所有程序中调用的静态函数,例如静态函数:Effects.addEffect(effect),它会为ArrayList effects

添加效果

根据这一点,班级Effects有以下几点:

  • 拥有此类的多个实例没有意义。
  • 在所有程序中全局调用类函数,因此如果类不是静态的,则应该在所有程序中传递实例!

根据良好的编程习惯,我应该使这个类单例,静态还是只是一个常规类,我应该在所有程序中传递一个实例?

3 个答案:

答案 0 :(得分:2)

这一切都归结为什么是“良好的编程实践”以及更广泛的背景。

对于需要测试和mocking组件的更大,更强大的解决方案,具有静态类是非常阻碍的,因为它不容易被替换。有些人认为遵循这些指导原则 - 避免静态类并确保组件易于测试 - 可以做出更好的设计(TDD是这种哲学的一个很好的例子)。

但是,请注意,在任何地方“携带”一个实例,我们称之为IEffects,如果您不使用Inversion of Control(IOC)和{{{{}}},可能会使您的设计“更重”且难以维护3}}(DI)用于解决依赖关系。

当我遇到这种困境时,这些是我一般会问自己的一些问题:

  • 我是否想要切换此组件的实现(例如StandardEffects vs HighDefinitionEffects)
  • 在测试依赖于此组件的其他组件时,我是否想要伪造模拟这个组件?
  • 使用接口(在您的情况下与单例连接)而不是静态类是否相对容易/轻松?

对任何这些问题回答通常会导致使用接口方法而不是静态类方法。

答案 1 :(得分:1)

单例类是一个对象,可以实现可以传递给对象和回调的对象的接口。如果您不需要其中任何一个,请将其设为静态类。

答案 2 :(得分:0)

正如您所说,您应该在Effect课程中使用静态方法。

您只有存储所有效果的静态变量。它仍然会在同一个变量中添加效果。那么为什么每次想要使用时都要为它创建对象?只需添加静态方法即可。如果您遇到多线程问题,则可以使用锁定或同步来处理它。使实例变量或实例方法访问静态变量没有意义。 你在谈论单身人士模式还是单身人士课程?