web-dev-qa-db-ja.com

Java:Thread.currentThread()。sleep(x)vs. Thread.sleep(x)

私のコードにこれがあります

Thread.currentThread().sleep(x);

Eclipseは静的を使用するように指示します

Thread.sleep(x); 

代わりに、なぜですか?違いは何ですか、これら2つの方法の間に機能性の違いはありますか?

80
Omu

メソッドは2つではなく1つだけで、静的です。インスタンス参照を介して静的メソッドを呼び出すことはできますが、スタイルは良くありません。これは、プログラマーがインスタンスメソッドを呼び出していると考えていることを示します。混乱しているプログラマーは、現在のスレッドではない別のスレッドをこの方法でスリープさせることができると考えているかもしれません。

どちらのコード行も同じことをしますが、2番目の方がより良いスタイルです。

128
Sean Owen

Javaでは、スリープは静的メソッドです。どちらの例もまったく同じことを行いますが、前のバージョンは特定のオブジェクトのメソッドを呼び出しているように見えますが、まったくそうしていないため、混乱しています。あなたの例ではそれほど重要ではありませんが、次のものがあるとより危険です:

someOtherThread.sleep(x);

今回は、他のスレッドにスリープを指示しているように見えますが、実際には現在のスレッドをスリープ状態にしています。このタイプの間違いを避ける方法は、特定のオブジェクトではなくクラスを使用して常に静的メソッドを呼び出すことです。

30
Mark Byers

2つのメソッド呼び出しは、同じメソッドを呼び出しますが、クラス名(Thread この場合)静的フィールドとメソッドにアクセスするためのインスタンスではなく、この静的性を明確にします。そのため、この警告が生成されます。

しかし、静的フィールドとメソッドがほとんどのIDEで特定の方法で表示されることを考慮すると(たとえば、EclipseおよびIntelliJ IDEAの斜体フォントで)、この警告はまだ必要ですか? Java単純なエディタが使用されていた初期の頃ほど必要ではなかったかもしれません。

3
Amir Moghimi

Thread.currentThread().sleep(x);またはその方法Eclipseは、必要に応じてThread.sleep(x);静的コンテキストが必要であるため、このスリープで少し遅れるのを待ちます。

1つのオブジェクトによって設定される静的なパラダイムは、その特定のオブジェクトヒーププリントライフサイクルにのみ影響します。オブジェクトライフサイクル全体の静的はそれほど面倒ではなく、必要に応じてコーディングを容易にするために使用できますが、静的なフットprintは、Class(たとえば:-Class.forName(pkg.className))によって参照され、objectのクラスの実行時の単一印刷コピーであるHEAPによってではなく、名前によって参照されます。 _メモリ。

繰り返しますが、オブジェクトの使用法には、弱点、幻影、強い種類の参照による長所と短所もあります。

コードは自然によって複雑にされています。それが機能するようにするための方法です。

0