するときは、クラスメソッド(静的メソッド)を使用する必要がありますか?メソッドのインスタンスを使用する場合は?

新しい同僚、書き込みJavaメソッドは修正を通して静的であるが、それは必要としないという理由だけで、新しいオブジェクトを直接呼び出すことができます。クラスメソッドは、静的な修飾を有する何も間違っを抽象化し、一般的には、直接クラスに書くのではなく、それらのほとんどは、ツールutilに配置する必要があり、パブリックメソッドを抽象化。静的メソッドの静的な修飾は、簡単な通話だけでなく、高速ではなく、実際のプログラミングが、推奨されません。

静的メソッドは、より多くのメモリを取るので、これはありませんが、より良い実際のプログラミングに適用するために、我々は、原理を理解しているため。例えば、なぜ、時にはあなたはシングルトンではなく、静的メソッドを使用する必要がありますか?例えば、いくつかの構成およびロードの特性、必要性は、ライフサイクル全体を通じて存在するが、一方のみを維持する必要があるが、これらの構成及び特性は、オブジェクト指向の手法により得られる今、この時間は、単一の実施の形態を使用することが必要であり、ただし静的メソッドは解決することができますが、最良の実施の形態またはシングルモード。

だから、静的メソッドを使用するには?

1)従来法ツールでは、特定の実施例に依存しないが、高周波数の使用。

静的メソッドを直接パラメータとしてのインスタンスがない限り、任意の非静的メンバを使用できないので、「光」方法2)オブジェクトを必要としません。

だから、それを使用する方法をインスタンス化する必要がありますか?
マルチスレッドのシナリオでは、静的変数の静的メソッドの変更操作が簡単に、この時間は、あなたがインスタンスメソッドを使用する必要があり、スレッドの安全性の問題につながる可能性があるため、この方法は、あなたがインスタンスメソッドを使用する必要があり、クラスのオブジェクトに依存します。

public class TestStatic {

	static class test {
		//静态成员变量
		static String a = "H";

		//修改该静态成员变量
		static void modify(String v) {
			a = v;
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				test.modify(Thread.currentThread().getName());
				System.out.println(Thread.currentThread().getName() + ":" + test.a);
			}).start();
		}
	}

}

なぜ、上記の結果はありますか?

Javaメモリー・モデル、各オブジェクトは、静的クラスのメンバ変数は、.classファイルながら全てので、分類、対応するロック例示的なモニターを有することなどが格納されている例示的なヒープオブジェクト、静的メンバ変数、配列要素、静的方法上記、対象クラス変数を取得し、その後、複数のスレッドの場合には、参照の共有変数vに直接ポイントに相当つのスレッドを変更する場合、クラスの静的変数、および、他のISを取得することが可能です変数スレッドを変更した後、スレッド不安のこのような状況となるよう。

それでは、どのようにこの問題を解決するには?答えはロックされています。

public class TestStatic {

	static class test {
		// 静态成员变量
		static String a = "H";

		// 修改该静态成员变量
		static void modify(String v) {
			a = v;
		}
	}

	public static void main(String[] args) {
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				synchronized (test.class) {
					test.modify(Thread.currentThread().getName());
					System.out.println(Thread.currentThread().getName() + ":" + test.a);
				}
			}).start();
		}
	}

}


输出:
Thread-4:Thread-4
Thread-7:Thread-7
Thread-6:Thread-6
Thread-5:Thread-5
Thread-1:Thread-1
Thread-2:Thread-2
Thread-0:Thread-0
Thread-3:Thread-3
Thread-9:Thread-9
Thread-8:Thread-8

もう一つの方法は、次のような静的メソッド、インスタンスメソッドの変更を、使用しないことです。

public class TestStatic {

	public static void main(String[] args) {
		test te = new test();
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				te.modify(Thread.currentThread().getName());
				System.out.println(Thread.currentThread().getName() + ":" + te.a);

			}).start();
		}
	}

}

class test {
	// 静态成员变量
	String a = "H";

	public String getA() {
		return a;
	}

	public void setA(String a) {
		this.a = a;
	}

	public test(String a) {
		super();
		this.a = a;
	}

	public test() {

	}

	// 修改变量
	void modify(String v) {
		a = v;
	}
}

 

公開された224元の記事 ウォン称賛34 ビュー70000 +

おすすめ

転載: blog.csdn.net/weixin_39309402/article/details/105060026