我想知道人们如何决定是否将方法定义为静态。我知道如果一个方法不需要访问实例字段,那么它只能被定义为静态。因此,假设我们有一个不访问实例字段的方法,您是否总是将此方法定义为静态,或者仅在您需要静态调用它时(不引用实例)。
也许另一种问同一个问题的方法是你是使用静态还是非静态?
答案 0 :(得分:44)
我尽可能使用静态方法。优点:
答案 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)。
从面向对象的角度来看,一个方法正在对某个对象做一些事情。因此,如果您正在使用实例化对象,那么我认为该对象的方法是非静态的是最有意义的。从技术上讲,从技术上讲,如果非静态类不需要访问实例,则可以使其具有静态成员。但表面上看,至少,一个类的方法仍然会对该类执行某些东西,所以我仍然会让它们变成非静态的。一切都是平等的,就是这样。