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

У меня это в моем коде

Thread.currentThread().sleep(x);

Eclipse говорит мне использовать статический

Thread.sleep(x); 

вместо этого, почему? Какая разница, есть ли какая-то разница в функциональности между этими двумя методами?

Ответ 1

Существует только один метод, а не два, и он является статичным. Хотя вы можете вызвать статический метод с помощью ссылки на экземпляр, это не хороший стиль. Это указывает, что программист считает, что он вызывает метод экземпляра. Смущенный программист может подумать, что он или она может вызвать другой поток (а не текущий), чтобы спать таким образом, когда это не то, что он делает.

Оба ваши строки кода делают то же самое, но второй - лучший стиль.

Ответ 2

В Java сон является статическим методом. Оба примера делают то же самое, но прежняя версия сбивает с толку, потому что похоже, что она вызывает метод на конкретном объекте, но не делает этого вообще. В вашем примере это не имеет большого значения, но более опасно, если у вас есть следующее:

someOtherThread.sleep(x);

На этот раз похоже, что вы говорите какой-то другой поток, чтобы спать, но на самом деле вы помещаете текущий поток в режим сна. Способ избежать этого типа ошибки - всегда вызывать статические методы, используя класс, а не конкретный объект.

Ответ 3

Два вызова метода идентичны в поведении, потому что они вызывают один и тот же метод, но используют имя класса ( Thread в этом случае), а не экземпляр для доступа к статическим полям и методам делает эту статичность понятной, Вот почему это предупреждение производится.

Но учитывая, что статические поля и методы показаны определенным образом в большинстве IDE (например, в курсивом шрифте в Eclipse и IntelliJ IDEA), это предупреждение по-прежнему необходимо? Возможно, не так много, как было в первые дни Java, что простые редакторы были в использовании.

Ответ 4

Thread.currentThread().sleep(x); или способ Eclipse говорит, что Thread.sleep(x); требуется статический контекст, если он в этом нуждается, поэтому мы удерживаемся на небольшую задержку с этим сном.

Статическая парадигма, установленная одним объектом, влияет только на этот конкретный жизненный цикл печати кучи объекта, опять же учитывая, что статический цикл жизненного цикла объекта не является чем-то назойливым, при необходимости его можно использовать для облегчения кодирования, но его нужно делать осторожно, поскольку static foot-print ссылается на Class (например: - Class.forName(pkg.className)) как на имя, а не на object, которая представляет собой копию одного экземпляра класса в HEAP в режиме времени выполнения.

Снова использование объекта также имеет плюсы и минусы по слабым, Phantom, сильный тип ссылок....,

Код Convoluted by Nature. Это как раз то, как мы делаем, чтобы заставить его работать и функционировать.