Language agnostic 什么时候使方法成为静态的?

Language agnostic 什么时候使方法成为静态的?,language-agnostic,oop,static-methods,Language Agnostic,Oop,Static Methods,我想知道人们是如何决定是否将方法定义为静态的。我知道,如果一个方法不需要访问实例字段,那么它只能被定义为静态的。假设我们有一个不访问实例字段的方法,您是否总是将此类方法定义为静态的,或者仅当您需要静态调用它时(不引用实例) 问同一问题的另一种方式可能是使用静态还是非静态作为默认值?如果该方法仅依赖于其参数,则可以将其设置为静态。如果该方法没有实例化任何其他用户定义的类,则可以将其设置为静态。不过,默认情况下,它是非静态的。在执行不操作类实例的操作时,请使用静态方法 一个完美的例子是数学类的sqr

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


问同一问题的另一种方式可能是使用静态还是非静态作为默认值?

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

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


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

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


阿基米德规则

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

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

视情况而定。在可以使用非成员函数的语言中,我会说,大多数情况下,如果方法可以是静态的,那么它应该是非成员函数,如果可能的话,应该是非友元函数。你可以告诉我,我的主要是C++背景。 在不可能使用非成员函数的“纯”OO语言中,这取决于该方法是“偶然”静态的(即,它恰好不需要访问实例成员),还是真正的逻辑静态的-它是整个类的方法,而不是特定实例的方法。

不久前曾就此主题撰写过文章(无可否认,从Java的角度来看,但我认为它也适用于其他语言)

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

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

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

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

当我详细阐述一个类时,我发现自己自然而然地会把它变成完全静态的或完全非静态的。实际上,如果我开始想在一个非静态类中定义静态成员,我经常会发现,最终将它们分成一个单独的静态类是最有意义的——或者是像数学这样的实用类或全局应用程序类(如.NET的ConfigurationManager)


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

主题外:你的化身带回了美好的回忆:)这可能对你有用:或者其中之一:,(Jon Skeet的回答)我认为这个问题不能真正回答语言不可知论。实用函数通常也是静态的。答案很好。这个答案很糟糕,因为它除了通过重复静态类方法的最基本定义来陈述显而易见的东西之外,没有给出任何推理。