だから私のコーダーの友人は、static
コーディングの使用を嫌います. それでも、私の Java プログラムは、クラス間をリンクするためのものでいっぱいです。
静的メソッドを削除するためにコード全体を書き直す価値はありますか?
どちらか一方を使用する利点はありますか?
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
は、それらの間で共有するxが1つだけになります。
3.静的変数は、JVMがクラスをロードするときに初期化されます。
4.Aは変数またはメソッドにアクセスstatic method
できません。Non-static
5. Static methods
とともにをStatic variables
模倣することはできますがSingleton Pattern
、クラスが多数ある場合のように、それは正しい方法ではありません。JVMのクラスのロード順序がわからないため、問題が発生する可能性があります。
static
インスタンスごとにコピーをしたくない場合のためのものです
instance
変数は、オブジェクトのインスタンスごとに個別のコピーが必要な場合に使用されます。
ビジネス ケースに基づいて、どちらを使用するかが変わる場合があります。
静的関数と変数が多すぎると、真のオブジェクト指向ではなく、より機能的なアプローチにつながる可能性があります。また、public static 変数がある場合は、良くないグローバル変数を複製します。それらを追跡することは悪夢です。
一般的に、私のルールは、オブジェクトではなくクラスに対して本当にジェネリックである場合にのみ、静的変数と関数を使用できる場合はインスタンス変数を使用することです
これは、同様の質問Java: when to use static methodsに対する非常に良い答えです
メソッドにリンクするだけでなく、新しい操作を使用して新しいオブジェクトを作成し、そこから非静的な方法でメソッドにアクセスすることを検討してください。
前
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 を他のメソッドと共有することもできます。
ガベージ コレクション - 静的フィールドは、インスタンス フィールドよりもはるかに長く存続します。論理的な観点からは、静的フィールドはすべてのインスタンス間で共有されることのみを想定しています。それが本当にあなたの場合であれば、もちろん問題はありません。
静的メソッドまたは静的プロパティについて話しているのですか?
静的メソッドに関する限り、それらを悪用する方法は 1 つしかありません。それは、オブジェクト インスタンスをパラメーターとして受け取るメソッドを定義する場合です。それを行う必要は決してありません。私の見解では、そうするのは不十分なコーディング手法です。次に例を示します。
static int add(ThisClass a, ThisClass b) {
return a.value + b.value;
}
クラス内の静的変数について話している場合、基本的には、特定のクラスのインスタンスが 1 つだけ存在することを意図した「シングルトン」の対象になります。シングルトンは多くの悪用にさらされています。これらは多くのクラス ライブラリ (JDNI やログ クラスなど) で使用されていますが、アプリケーションがそれらを広範囲に使用する場合は、プログラムの構造が不十分である可能性があります。それはおそらくあなたの友人が怒っていることです.
静的オブジェクトを使用する場合 (シングルトンの場合を除く)、実際にはグローバル変数と組み合わせた関数型プログラミングを実装しています。それを頻繁に行う場合は、設計または Java の使用を再検討する必要があります (おそらく、リストやスキームなどの関数型プログラミング言語を使用する必要があります)。
プロ スタティック
クラスの内部または外部から静的メンバーが呼び出されると、クラスの静的コンストラクターが呼び出されます。「静的オブジェクト」はセッション全体を通じて存続するため、パフォーマンスが向上します。
コンスタティック
静的メンバーは状態を持つことができないため、クラスの非静的メンバーと話すことはできません。
例
BigInteger クラスを考えると、一部のパーツを静的メンバーにすると、このクラスが得られます。
クラスのインスタンスは (予想どおり) 大きな整数を表します。
ただし、主なメソッドの add とmultiply は静的ではなく (より良い世界では静的である必要があります)、パフォーマンスが低下します。
したがって、実際には、静的と非静的の混合を恐れるべきではありません。