关于语言不可知:何时使方法静态?

When to make a method static?

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

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


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

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

Kevin Bourrillion不久前就这个话题写了一个富有洞察力的答案(诚然,从Java的角度来看,但我认为它也适用于其他语言)。

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

A"pure function" is any method which does not modify any state and whose
result depends on nothing but the
parameters provided to it. So, for
example, any function that performs
I/O (directly or indirectly) is not a
pure function, but Math.sqrt(), of
course, is.

我倾向于同意。(尽管在我自己的代码中,传统上,我可能使用了太多的静态助手方法…:-p这无疑使使用这些方法的代码更难测试。)


在执行不在类实例上操作的操作时,请使用静态方法。

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


如果方法的功能仅仅依赖于它的参数,那么可以将其设置为静态的。如果该方法没有实例化任何其他用户定义的类,则可以将其设置为静态的。不过,默认情况是将其设置为非静态的。


视情况而定。在可能使用非成员函数的语言中,我会说,大多数情况下,如果方法可以被设置为静态的,那么它应该改为非成员函数,如果可能的话,应该是非友元函数。你可以告诉我,我有一个主要的C++背景。

在"纯"OO语言中,非成员函数是不可能的,这取决于方法是"偶然"静态的(即,它恰好不需要访问实例成员),还是真正的逻辑静态的——它是整个类的方法,而不是特定的实例。


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

当我精心设计一门课时,我发现自己自然地集中在使它完全静态或完全非静态上。实际上,如果我开始想在一个非静态类中定义静态成员,我经常会发现,将这些成员分解为一个单独的静态类——一个实用程序类(如Math)或全局应用程序类(如.NET的ConfigurationManager),最终是最有意义的。

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


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

阿基米德法则!