何时使方法静态?

Dón*_*nal 45 language-agnostic oop static-methods

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

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

Tho*_*mas 47

我尽可能使用静态方法.好处:

  • 从实例方法内部调用静态方法时,可以确保当前对象的状态没有副作用.
  • 从静态方法内部,您可以确保不会意外地修改对象实例的任何状态.
  • 您可以在类之外使用静态方法而无需构造实例.如果可以使方法静态,它显然不需要实例,因此不需要一个实例.
  • 静态方法可能稍微更高效,因为不需要传递"this"指针,并且不需要动态分派.


Jon*_*nik 24

Kevin Bourrillion在不久前了一篇关于这个主题的深刻答案(不可否认,从Java的角度来看,但我认为它也适用于其他语言).

他认为你基本上应该使用静态方法来实现纯函数.

" 纯函数 "是任何不修改任何状态的方法,其结果仅取决于提供给它的参数.因此,例如,任何执行I/O(直接或间接)的函数都不是纯函数,但Math.sqrt()当然是.

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

  • 这篇文章的评论也值得一读! (2认同)

Otá*_*cio 5

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


Jac*_*kin 5

在执行不对类的实例进行操作的操作时,请使用静态方法.

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

  • 实用功能通常也是静态的.好答案. (2认同)