何时使方法静态?

时间:2010-04-26 13:05:06

标签: language-agnostic oop static-methods

我想知道人们如何决定是否将方法定义为静态。我知道如果一个方法不需要访问实例字段,那么它只能被定义为静态。因此,假设我们有一个不访问实例字段的方法,您是否总是将此方法定义为静态,或者仅在您需要静态调用它时(不引用实例)。

也许另一种问同一个问题的方法是你是使用静态还是非静态?

7 个答案:

答案 0 :(得分:44)

我尽可能使用静态方法。优点:

  • 从实例方法中调用静态方法时,可以确保当前对象的状态没有副作用。
  • 从静态方法内部,您可以确保不会意外地修改对象实例的任何状态。
  • 您可以在类之外使用静态方法而无需构建实例。如果可以使方法成为静态,那么显然不需要实例,因此不需要实例。
  • 静态方法可能会稍微提高效率,因为不需要传递“this”指针,也不需要动态调度。

答案 1 :(得分:24)

Kevin Bourrillion前一段时间就这个主题写了an insightful answer(从Java的角度来看,我认为它也适用于其他语言)。

他认为你基本上应该 纯函数使用静态方法。

  

pure function”是任何不修改任何状态及其状态的方法   结果取决于除了   提供给它的参数。因此对于   例如,任何执行的功能   I / O(直接或间接)不是   纯函数,但是Math.sqrt()   当然是。

我倾向于同意。 (虽然在我自己的代码中,传统上,我可能在整个地方使用过多的静态辅助方法...... :-P这肯定使得使用这些方法的代码更难以测试。)

答案 2 :(得分:5)

如果该方法的作用仅取决于其参数,则可以将其设为静态。如果该方法未实例化任何其他用户定义的类,则可以将其设置为静态。但是,默认设置是将其设置为非静态。

答案 3 :(得分:5)

当您执行不对该类实例进行操作的操作时,请使用静态方法。

一个完美的例子是sqrt类的Math方法。

答案 4 :(得分:3)

这取决于。在非成员函数可能的语言中我会说大多数情况下,如果方法可以变为静态,那么它应该成为非成员函数,如果可能的话,非朋友。你可以说我主要是C ++背景。

在“纯”OO语言中,非成员函数是不可能的,这将取决于该方法是否只是“偶然”静态(即它恰好不需要访问实例成员),或者在逻辑上是静态的 - 它是整个类的一种方法,而不是特定的实例。

答案 5 :(得分:0)

默认情况下是非静态的,当我需要从至少两个不同的类可用的功能时静态,并且我不想浪费构造函数。

PS。阿基米德规则!

答案 6 :(得分:0)

(C#)默认情况下,我在静态类中使用静态方法,在非静态类中使用非静态方法。

在我详细阐述一个课程时,我发现自己会自然地将其完全静态化或完全非静态化。实际上,如果我开始想要在非静态类中定义静态成员,我经常会发现最终将它们分解为一个单独的静态类最有意义 - 像Math这样的实用程序类或全局应用程序class(比如.NET的ConfigurationManager)。

从面向对象的角度来看,一个方法正在对某个对象做一些事情。因此,如果您正在使用实例化对象,那么我认为该对象的方法是非静态的是最有意义的。从技术上讲,从技术上讲,如果非静态类不需要访问实例,则可以使其具有静态成员。但表面上看,至少,一个类的方法仍然会对该类执行某些东西,所以我仍然会让它们变成非静态的。一切都是平等的,就是这样。