web-dev-qa-db-ja.com

Javaで静的変数/メソッドをいつ使用し、インスタンス変数/メソッドをいつ使用するか?

静的変数/メソッドを使用した方がよい場合や、Javaでインスタンス変数/メソッドを使用した方がよい場合に質問したいのですが?

特定のケースに依存することは知っていますが(静的メソッドとしてのutilクラスのプログラミングなど)、一般的な戦略のようなものを宣言できますか?

14
user3133542

初心者レベル:

次の場合にインスタンス変数を使用します。すべての変数は、オブジェクトごとに異なる値を持っています。例えば。学生の名前、ロール番号など.

静的変数を使用する場合:変数の値がオブジェクトから独立している(オブジェクトごとに一意ではない)。例えば。受講生の数。

21
TheLostMind

static変数は定数によく使用されます。これは、クラスのすべてのインスタンスに共通です。たとえば、多くの人はコードに定数を "ハードコード"することを好みません。彼らはpublic staticまたはprivate static変数に意味のある名前を付け、コードで使用すると、コードが読みやすくなります。

要するに

クラスのインスタンスの状態に依存しないすべてのメソッドまたは変数は静的である必要があります

8

静的変数:アプリケーション全体で使用されるものが必要で、すべてのインスタンスが変数を知る必要がある場合。

インスタンス変数:静的変数がクラスのプロパティであるのに対し、オブジェクトごと、オブジェクトのプロパティごとに異なります。

静的関数:いくつかのユーティリティタスクを実行するために使用されます。オブジェクト宣言なしで呼び出すことができます。

インスタンス関数:この関数を呼び出すにはオブジェクトが必要です。

staticまたはinstanceは用途に依存します。

7
Md. Yusuf

静的変数は、クラス全体のグローバル変数と考えるか、「final」キーワードを使用する場合は、クラス全体のグローバル定数と考えてください。静的な非最終変数を賢く使用してください。これらの変数はすべてのクラスインスタンス間で共有されており、明らかでない間違いを引き起こす可能性があります。可変の静的変数をまったく使用しないことをお勧めします。依存関係の注入を使用してそのようなニーズを実装できなかったケースはほとんどありません。

また、グローバルを使用すると、常にユニットテストが非常に困難になります。考慮すべきもう1つの欠点です。

2
Denis Kulagin

メソッドについて:すべてのメソッドFoo.method(Bar1 b1, Bar2, b2)は、定義により、常に代替の同等の設計を持つことができます。

Bar.altmethod(Foo f, Bar b2)

そして

static staticMethod(Foo f, Bar b1, Bar b2)

また、後者のメソッドを、それ自体がシングルトンであるサービスクラスのインスタンスメソッドとしてラップすることもできます(そのため、メソッドの静的性は、それが含まれるクラスによって少し隠されます)。

(静的バージョンの)メソッド引数の1つのクラスのインスタンスメソッドとしてメソッドを使用する唯一のcompelling理由は、そのクラスのサブクラスが存在すると予想される場合であり、それらのサブクラスがメソッドの特別な実装を持つのに役立つかもしれません。

想像してみて

class GeographicalFigure {
    Object quadrature() { ... }
}

後で追加する可能性を開いたままにしておくと便利です

class Circle extends GeographicalFigure {
    Object quadrature() {
        throw new ThisIsNoGoodException();
    }
}

それ以外は、すべてのオプションは基本的に同等です。

0
Erwin Smout