web-dev-qa-db-ja.com

Java Static vs Instance

私のコーダーの友人は、staticコーディングの使用を嫌っています。しかし、私のJavaプログラムはクラス間をリンクするためにそれでいっぱいであり、私はそれらがたくさんあります!

静的メソッドを削除するためにコード全体を書き直す価値はありますか?

どちらかを使用する利点はありますか?

23
Kezz101

1。インスタンス変数はオブジェクトごとに1つ、すべてのオブジェクトにはインスタンス変数の独自のコピー。

例:

public class Test{

   int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

どちらも t1およびt2は、の独自のコピーxを持ちます。

2。静的変数は、クラスごとに1つのすべてのオブジェクトそのクラスは同じ静的変数を共有します。

例:

public class Test{

   public static int x = 5;

 }

Test t1 = new Test();   
Test t2 = new Test();

どちらも t1およびt2は、それらの間で共有するために正確に1つのxを持ちます。

3。静的変数は、JVMがクラスをロードするときに初期化されます。

4。A static methodcannotアクセスNon-static変数またはメソッド。

5。Static methods に加えて Static variables canmimica Singleton Pattern、しかし、それは正しい方法ではありません、多くのクラスがあるときのように、クラスのロード順序がわからないJVM。これにより問題が発生する可能性があります。

37

staticは、各インスタンスのコピーを保持したくない場合に使用します

instance変数は、オブジェクトのインスタンスごとに個別のコピーが必要な場合に使用します。

ビジネスケースに基づいて、どちらを使用するかは変わる可能性があります。

7
kosa

静的関数と変数が多すぎると、本当のオブジェクト指向ではなく、より機能的なアプローチにつながる可能性があります。また、パブリック静的変数がある場合は、グローバル変数を複製しますが、これは適切ではありません。それらを追跡することは悪夢です。

一般的に私のルールは、オブジェクトではなくクラスに対して実際にジェネリックである静的変数と関数が可能な場合にのみインスタンス変数を使用することです

これは、同様の質問に対する非常に良い答えです Java:静的メソッドを使用する場合

メソッドにリンクするだけでなく、新しい操作を使用して新しいオブジェクトを作成し、そこから非静的な方法でメソッドにアクセスすることを検討してください。

public void myMethod(){
    Time.setTime(Time.getTime() + 20);
    System.out.println(Time.getTime());
}

public void myMethod(){
    Time t = new Time();
    t.setTime(t.getTime() + 20);
    System.out.println(t.getTime());
}

これらのメソッドで保持される状態は、作成した時間のインスタンスになります。必要に応じて、変数tを他のメソッドと共有することもできます。

4
RNJ

ガベージコレクション-静的フィールドはインスタンスフィールドよりもずっと長く生きます。論理的な観点から見ると、静的フィールドはすべてのインスタンス間で共有されると想定されています-本当にそうであれば、もちろん問題はありません。

3
Eugene

インスタンスおよび静的変数:

あなたの質問への回答:静的変数を使用してメモリ割り当てを節約する価値があると思います。

メモリ割り当て:

静的変数の場合、作成されるオブジェクトの数に関係なく1つのメモリ位置のみが割り当てられ、インスタンス変数の場合、各オブジェクトに1つのメモリ位置が割り当てられます

ここでこの例を検討してください。1MオブジェクトをEmployeeクラスに作成し、Employeeクラスのプロパティをeid、ename、ecompanyに作成する必要がある企業内部プロジェクトに取り組んでいると考えてください。今重要なことは、すべての従業員が[〜#〜] xyz [〜#〜]会社で働いているため、プロパティの値ecompanyは「XYZ」に関係なく社員。

これで状況がわかりました。プロパティの値ecompanyは100万オブジェクトに対して[〜#〜] xyz [〜#〜]になります。

ここで、ecomapnyプロパティを静的またはメモリ割り当てを考慮したインスタンスとして宣言することにしました

静的として宣言した場合、ecompanyに割り当てられる最小メモリは48バイトになり、100万インスタンス変数を格納するために必要なメモリに比べて非常に少なくなります。 100000 * 48バイト= 4,800万バイト。

1
user4408375

静的メソッドまたは静的プロパティについて話しているのですか?

静的メソッドに関する限り、それらを悪用する方法は1つしかありません。それは、オブジェクトインスタンスをパラメーターとして取るメソッドを定義するときです。あなたはそれをする必要は決してないはずであり、私の見解ではそうすることは貧弱なコーディング慣行です。以下に例を示します。

static int add(ThisClass a, ThisClass b) {
   return a.value + b.value;
}

クラス内の静的変数について話している場合は、基本的に「シングルトン」の主題になります。これは、特定のクラスのインスタンスを1つだけにすることを目的としています。シングルトンは多くの虐待を受けます。これらは多くのクラスライブラリ(JDNIとロギングクラスを考えてください)で使用されますが、アプリケーションがそれらを広範囲に使用する場合、構造が不十分なプログラムの兆候である可能性があります。それはおそらくあなたの友人がうんざりしていることです。

1
AlanObject

Pro Static

クラスの内部または外部から静的メンバーが呼び出されると、クラスの静的コンストラクターが呼び出されます。 「静的オブジェクト」はセッション全体を通じて有効であるため、パフォーマンスが向上します。

Con Static

静的メンバーは状態を持つことができないため、クラスの非静的メンバーと通信できません。

BigIntegerクラス を検討する場合、このクラス獲得する一部のパーツが静的メンバーになった場合。

クラスのインスタンスは(予想どおり)大きな整数を表します。

ただし、メインメソッドの加算と乗算は静的ではなく(より良い世界にあるべきです)、パフォーマンスに悪影響を及ぼします。

したがって、実際には、静的と非静的の混在を恐れないでください。

0
AD.

静的変数またはメソッドは実際の継承がないため、使用するのは好きではありません。これにより、テスト用のモックがより難しくなります。インスタンスを使用すると、完全なポリモーフィズムの柔軟性が得られます。一方、グローバルキャッシュなどでは、静的変数が必要になる場合があります。静的メソッドは、アクセスまたは拡張ができないクラス/オブジェクト/プリミティブのヘルパーメソッドを提供する場合に役立ちます。これらのヘルパーメソッドは非常に単純なので、継承は必要ありません。たとえば、Java.util.ArraysクラスまたはJava.util.Collections。

0
Maarten

静的オブジェクトを使用する場合(シングルトンの場合を除く)、実際にはグローバル変数と組み合わせた関数型プログラミングを実装しています。あなたがそれをたくさんやるなら、あなたはあなたのデザインまたはJava(リスト、スキームなどのような機能的なプログラミング言語を使うべきです)のどちらかを再考する必要があります。

0
alfasin