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

我在我的代码中有这个

Thread.currentThread().sleep(x); 

Eclipse告诉我使用静态的

 Thread.sleep(x); 

相反,为什么? 有什么区别,这两种方法在function上有什么区别吗?

只有一个方法,不是两个,而是静态的。 虽然你可以通过实例引用调用一个静态方法,但它不是很好的风格。 这表示程序员认为他或她正在调用实例方法。 一个困惑的程序员可能会认为他或她可能会导致另一个线程(而不是当前的线程)以这种方式睡觉,但这不是它所做的。

你的代码行都做同样的事情,但第二个是更好的风格。

在Java中,睡眠是一种静态方法。 你的例子都是一样的东西,但是前一个版本很混乱,因为它看起来像是在一个特定的对象上调用一个方法,但是根本没有这样做。 在你的例子中,这并不重要,但是如果你有以下几点,则会更危险:

 someOtherThread.sleep(x); 

这次看起来你正在告诉别的线程睡觉,但实际上你正在把当前的线程hibernate。 避免犯这种错误的方法是总是使用类来调用静态方法,而不是使用特定的对象。

这两个方法调用在行为上是相同的,因为它们调用相同的方法,但是使用类名称(在这种情况下是Thread )而不是实例来访问静态字段和方法,这使得静态性变得清晰。 这就是产生这个警告的原因。

但考虑到在大多数IDE中以特定的方式显示静态字段和方法(例如,在Eclipse和IntelliJ IDEA中以斜体字显示),这个警告仍然是必需的吗? 也许并不像Java早期那样简单的编辑器正在使用中。

Thread.currentThread().sleep(x); 或者Eclipse的说法Thread.sleep(x); 如果需要,静态上下文是必需的,所以我们坚持稍微延迟这个睡眠。

由一个对象设置的静态范式只影响特定的对象堆生命周期,再次考虑整个对象生命周期静态不是那么麻烦,如果需要的话,它可以用来简化编码,打印被按Class引用(例如: – Class.forName(pkg.className) ),而不是由HEAP存储器中类的运行时单个打印副本的任何object Class.forName(pkg.className)

对象的再次使用也有弱,幻影,强types的参考….的优点和缺点,

代码是自然卷入的。 这只是我们如何做才能使其工作和function。