2008-09-07 10 views
28

さらに、インスタンスメソッドに対して静的メソッドにパフォーマンス上の利点はありますか?メソッドはいつ静的にするべきですか?

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

方法は静的である必要があります場合は?

  1. から読み込むことも、引数を受け取るオブジェクト
  2. 数学的手法の状態の独立
  3. インスタンスフィールドへの書き込みは、それらの 引数にアルゴリズムを適用し、
  4. ファクトリー・メソッドの値を返すどちらコンストラクタの代わりに使用されるもの

私はスタックのフィードバックに非常に興味がありますこれにコミュニティをオーバーフローさせる。

答えて

20

メソッドがインスタンスに含まれていない場合は、メソッドを静的にします。マイクロ最適化を汗ばませないでください。

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

15

メソッドが静的であるかどうかは、効率よりも設計上の配慮です。静的メソッドはクラスに属し、非静的メソッドはオブジェクトに属します。 Mathクラスを使用していた場合は、Mathに関連する概念であるため、加算と減算を扱う静的メソッドがいくつかあります。しかし、Carクラスを持っていれば、一般的な車の概念ではなく、特定の車に関連付けられているため、ギアやステアリングを変更する静的でない方法がいくつかあります。

1

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

しかし、特に、不要なパラメータの受け渡しが最適化されるようにする言語では、ノイズが発生する可能性があります。

+0

コンパイル時に完全に最適化されています(ほとんどの場合)。 –

+0

C++で最適化することはできません。呼び出し元は、呼び出し先が "this"を使用しないことを知る方法がないため、それを無関係に渡す必要があります。他の言語については、YMMV。 – Roddy

2

@jagmal私はどこかの電線が交差していると思います。あなたが挙げている例はすべて静的な方法ではありません。

スタティックメソッドは、クラスの抽象プロパティと概念を完全に扱う必要があります。つまり、インスタンス固有の属性に関係するものではありません。

車の例では、速度、駆動される駆動力は明らかに属性に関連しています。車のレベルで考えると、ギヤシフトと速度計算は属性に依存しますが、車から継承するcarModelクラスを考えてみましょう。この時点で、必要な属性(車輪の直径など)は次のように定義できます。そのレベルの定数。

+3

あなたは正しいです。私は本当に混乱してしまった。当時の私は睡眠不足だったかもしれません。 SOの精神で、私はそのコメントを削除しました。私は、人々がすでに話したこと以上に何かを追加するつもりはないと思います。とにかく、ありがとう。 – Jagmal

2

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

手続き型コードを書いているので、手続き型であることが理にかなったら、それを行います。もしそうでなければ、それはたぶんインスタンスメソッドであるべきです。

このアイデアはan article by Steve Yeggeから取られました。これは興味深くて有用な読書だと思います。

12

静的メソッドのもう1つの問題は、ユニットテストをJavaで書くことはかなり苦痛だということです。どのような方法でも静的メソッドをモックすることはできません。 post on google testing blog about this issueがあります。

私の経験則は、外部の依存関係(データベースアクセス、読み取りファイル、電子メールなど)がない場合にのみ、静的メソッドを作成してできるだけシンプルに保つことです。

+0

この回答をありがとう。私はしばしば、いくつかのメソッドを静的にします(実際にはインスタンスの一部ではないため)。しかし、今私はそれらのメソッドを静的にするのは避けてください。 – flipperweid

0

メソッドを静的にするときに考慮するもう1つのことは、クラスを見ることができる誰でも静的メソッドを呼び出すことができることです。 mehtodがインスタンスメソッドの場合は、インスタンスにアクセスできるユーザーだけがそのメソッドを呼び出すことができます。

関連する問題