web-dev-qa-db-ja.com

メソッドを静的にするのはいつですか?

メソッドをstaticとして定義するかどうかを人々がどのように決定するか知りたいのですが。インスタンスフィールドへのアクセスを必要としない場合にのみ、メソッドを静的として定義できることを知っています。したがって、インスタンスフィールドにアクセスしないメソッドがあるとします。そのようなメソッドを常に静的として定義しますか、それとも静的に(インスタンスへの参照なしで)呼び出す必要がある場合のみです。

おそらく、同じ質問をする別の方法は、デフォルトとして静的または非静的を使用するかどうかです。

45
Dónal

可能な限り静的メソッドを使用します。利点:

  • インスタンスメソッド内から静的メソッドを呼び出す場合、現在のオブジェクトの状態に副作用がないことを確認できます。
  • 静的メソッドの内部から、オブジェクトインスタンスの状態を誤って変更しないようにすることができます。
  • インスタンスを作成せずに、クラスの外部から静的メソッドを使用できます。メソッドを静的にすることが可能であった場合、明らかにインスタンスを必要としないので、インスタンスを必要とする必要はありません。
  • "this"ポインターを渡す必要がなく、動的なディスパッチが不要なため、静的メソッドの方が少し効率的かもしれません。
47
Thomas

Kevin Bourrillion 書いた 洞察に満ちた答え 少し前にこのトピックについて(確かにJavaの観点から)、それは他の言語にも適用されます)。

彼は、基本的にonlypure関数には静的メソッドを使用するべきだと主張しています。

" pure function "は、状態を変更せず、その結果がパラメーターにのみ依存する任意のメソッドです。したがって、たとえば、I/Oを(直接的または間接的に)実行する関数は純粋な関数ではありませんが、Math.sqrt()はもちろんそうです。

私は同意する傾向があります。 (私自身のコードでは、伝統的に、私はおそらく場所全体であまりにも多くの静的ヘルパーメソッドを使用してきました... :-Pそして、これは確かにそれらのメソッドを使用するコードをテストすることを難しくしました。)

25
Jonik

メソッドの動作が引数のみに依存する場合は、静的にすることができます。メソッドが他のユーザー定義クラスをインスタンス化しない場合は、それを静的にすることができます。ただし、デフォルトでは、静的ではありません。

5
Otávio Décio

クラスのインスタンスを操作しない操作を実行する場合は、静的メソッドを使用します。

完璧な例は、sqrtクラスのMathメソッドです。

5
Jacob Relkin

場合によります。非メンバー関数が可能な言語では、ほとんどの場合、メソッドcouldを静的にする場合は、代わりに非メンバー関数にし、可能であれば非フレンドにする必要があります。 。私がほとんどC++のバックグラウンドを持っていることがわかります。

「純粋な」OO非メンバー関数が不可能な言語では、メソッドが「偶然に」静的であるだけであるかどうかに依存します(つまり、インスタンスメンバーへのアクセスを必要としない場合があります)。または本当に論理的に静的です-特定のインスタンスではなく、クラス全体のメソッドです。

3

デフォルトでは静的ではなく、少なくとも2つの異なるクラスから機能を利用できるようにする必要があり、コンストラクターを無駄にしたくない場合は静的です。

ps。アルキメデスのルール!

0
David Rutten

(C#)デフォルトでは、静的クラスでは静的メソッドを使用し、非静的クラスでは非静的メソッドを使用します。

クラスを詳しく説明すると、自然に、完全に静的または完全に非静的にすることに集中しています。実際には、非静的クラス内で静的メンバーを定義したい場合、それらを個別の静的クラス(Mathのようなユーティリティクラスまたはグローバルアプリケーション)に分割することが最終的に最も理にかなっていることがよくあります。クラス(.NETのConfigurationManagerなど)。

オブジェクト指向の観点から見ると、メソッドはオブジェクトに対して、またはオブジェクトを使って何かを実行しています。したがって、インスタンス化されたオブジェクトを使用している場合、そのオブジェクトのメソッドを非静的であると考えることが最も理にかなっています。技術的には、インスタンスにアクセスする必要がない場合は、技術的に非静的クラスに静的メンバーを含めることができます。しかし、表面上は、少なくとも、クラスのメソッドはdoingであり、そのクラスとの間で何かがあるので、私はそれらを非静的にします。すべてが等しいということです。

0
Calvin Fisher