何时使用静态类和方法?

7

我有一个一般性的问题...什么时候应该使用静态类或静态方法?.. 我知道静态方法可以在不实例化的情况下调用...而静态类只应用于静态方法?...但是是否还有与此相关的性能问题...以及何时应优先使用实例方法和类?..如果有人能简要说明我何时应该选择使用它们,何时应该避免使用它们?

4个回答

6

4
需要翻译的内容:

需要记住的一件事是静态方法的测试影响。静态方法“封闭”了许多接缝。 接缝是您可以在不更改生产代码的情况下更改行为的地方; 示例包括子类化或链接到测试库。由于静态方法在编译时解析并且没有动态绑定,因此您无法插入测试对象并更改静态方法的行为方式。测试该类将会很麻烦。

对于数学函数之类的东西,您可以相当确定静态方法没问题,但您几乎肯定不希望静态方法连接到数据库。想想如何测试使用您正在考虑制作的静态方法的代码

这是来自Google测试博客的一个很好的链接:Static Methods are Death to Testability


太棒了 - 我超级喜欢 Miško Hevery。你看过他的 Google Tech Talks 吗?(我想这是他的演讲标题为“清洁代码谈 - 单元测试”,但他所有的演讲都值得一看。)这些演讲对我来说触发了一个惊人的认知超新星时刻,将 IOC 和 TDD 融合成一种史诗般的超级武器。 - chickeninabiscuit
"静态方法“封闭”了许多接缝点。这对于低级方法不重要,但对于高级方法却很重要。" - Raedwald

1

我认为一个通用的经验法则是实用函数应该是静态的。一个典型的例子就是在任何oop语言中,Math类将包含像sqrt()这样的静态方法,因为真的没有必要有一个单独的Math对象。

至于静态类,你应该考虑保持一种状态形式的类,通常像会话信息一样,无论通过应用程序的确切路径旅行,都需要它,并且你通常只需要一个。 (想想你的浏览器,可能总是保持着一个cookie-jar类)

静态变量是全局变量的较少邪恶的孪生兄弟(它们保持它们的值,但其作用域仅限于函数),通常有用于保持某种形式的状态(例如数据缓存)或枚举应该是唯一的东西,但其编号对于函数或应用程序的范围外并不重要(比如,从自己的debug("..")或profile()函数中编号调试或分析呼声)

基本上,只有当你非常确定以“正确”的OOP方式处理事情会导致创建一个怪物时,才使用它们中的任何一个。


0
据我理解,当没有必要创建一个类的对象来调用操作或该类在应用程序中很常见时,就不需要创建。例如,在C#中,Console类是密封的(因此您不能创建对象并继承它,也没有真正必要这样做)。但是,专业人士会更好地解释给你听。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接