34

さらに、インスタンスメソッドよりも静的メソッドの方がパフォーマンス上の利点はありますか?

私は最近次のものに出くわしました: http: //www.cafeaulait.org/course/week4/22.html

メソッドはいつ静的である必要がありますか?

  1. インスタンスフィールドからの読み取りもインスタンスフィールドへの書き込みもしません
  2. オブジェクトの状態に依存しない
  3. 引数を受け入れ、それらの引数にアルゴリズムを適用し、値を返す数学メソッド
  4. コンストラクターの代わりに機能するファクトリメソッド

これに関するStackOverflowコミュニティのフィードバックに非常に興味があります。

4

8 に答える 8

24

インスタンスの一部でない場合は、メソッドを静的にします。マイクロ最適化に汗を流さないでください。

静的である可能性のあるプライベートメソッドがたくさんあることに気付くかもしれませんが、常にインスタンスメソッド(または相互)から呼び出します。その場合、それはそれほど重要ではありません。ただし、実際にコードをテストし、おそらく他の場所からコードを使用できるようにしたい場合は、それらの静的メソッドを別のインスタンス化できないクラスで作成することを検討することをお勧めします。

于 2008-09-07T20:33:39.663 に答える
19

メソッドが静的であるかどうかは、効率よりも設計上の考慮事項です。静的メソッドはクラスに属し、非静的メソッドはオブジェクトに属します。Mathクラスがある場合、これらはMathに関連する概念であるため、加算と減算を処理するための静的メソッドがいくつかある可能性があります。ただし、車のクラスがある場合は、ギアを変更して操縦するための非静的な方法がいくつかある可能性があります。これらは特定の車に関連付けられており、一般的な車の概念ではないためです。

于 2008-09-07T20:33:59.537 に答える
12

静的メソッドのもう1つの問題は、少なくともJavaで、静的メソッドの単体テストを作成するのが非常に難しいことです。静的メソッドをモックすることはできません。この問題についてのグーグルテストブログに投稿があります。

私の経験則では、静的メソッドは、外部の依存関係(データベースアクセス、ファイルの読み取り、電子メールなど)がない場合にのみ記述して、可能な限り単純に保ちます。

于 2008-09-07T22:59:19.580 に答える
2

静的メソッドを作成するときはいつでも、その動作を簡単に変更できない柔軟性のないメソッドを作成していることを覚えておいてください。

あなたは手続き型のコードを書いているので、手続き型であることが理にかなっている場合は、そうしてください。そうでない場合は、おそらくインスタンス メソッドである必要があります。

このアイデアは、Steve Yegge の記事から引用したもので、興味深く有用な読み物だと思います。

于 2008-09-07T21:36:10.963 に答える
1

パフォーマンス面では、C ++静的メソッドは、非仮想インスタンスメソッドよりもわずかに高速になる可能性があります。これは、メソッドに「this」ポインターを渡す必要がないためです。同様に、VMTルックアップが必要ないため、どちらも仮想メソッドよりも高速になります。

ただし、特に不要なパラメータの受け渡しを最適化できる言語の場合は、問題が発生する可能性があります。

于 2008-09-07T20:59:01.707 に答える
1

@jagmalどこかでワイヤーが交差していると思います-リストしたすべての例は明らかに静的メソッドではありません。

静的メソッドは、クラスの抽象プロパティと概念を完全に処理する必要があります。インスタンス固有の属性に関連付けてはなりません (関連付けると、ほとんどのコンパイラが怒鳴ります)。

車の例では、速度、走行距離は明らかに属性に関連しています。車のレベルで考えると、ギアシフトと速度の計算は属性に依存しますが、車から継承する carModel クラスを考えてみましょう: この時点で、必要な属性 (車輪の直径など) を次のように定義できるため、これらは静的メソッドになる可能性があります。そのレベルの定数。

于 2008-09-07T21:26:25.713 に答える
0

String.Formatが静的である理由に関する関連する議論があり、いくつかの理由が浮き彫りになります。

于 2008-09-07T20:32:19.417 に答える
0

メソッドを静的にするときに考慮すべきもう 1 つのことは、クラスを表示できる人なら誰でも静的メソッドを呼び出すことができるということです。一方、メソッドがインスタンス メソッドの場合、インスタンスにアクセスできる人だけがそのメソッドを呼び出すことができます。

于 2015-08-04T08:40:40.130 に答える