web-dev-qa-db-fra.com

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

J'ai ceci dans mon code

Thread.currentThread().sleep(x);

Eclipse me dit d'utiliser le statique

Thread.sleep(x); 

à la place, pourquoi? Quelle est la différence, y a-t-il une différence de fonctionnalité entre ces 2 méthodes?

80
Omu

Il n'y a qu'une seule méthode, pas deux, et elle est statique. Bien que vous puissiez appeler une méthode statique via une référence d'instance, ce n'est pas un bon style. Cela indique que le programmeur pense qu'il appelle une méthode d'instance. Un programmeur confus pourrait penser qu'il peut faire en sorte qu'un autre thread (pas le thread actuel) s'endorme de cette façon, alors que ce n'est pas ce qu'il fait.

Vos deux lignes de code font la même chose mais la seconde est un meilleur style.

128
Sean Owen

En Java, le sommeil est une méthode statique. Vos deux exemples font exactement la même chose, mais l'ancienne version prête à confusion car il semble qu'elle appelle une méthode sur un objet spécifique, mais ne le fait pas du tout. Dans votre exemple, cela n'aura pas beaucoup d'importance, mais c'est plus dangereux si vous disposez des éléments suivants:

someOtherThread.sleep(x);

Cette fois, il semble que vous dites à un autre thread de s'endormir, mais en fait, vous mettez le thread actuel en veille. Le moyen d'éviter ce type d'erreur consiste à toujours appeler des méthodes statiques à l'aide de la classe plutôt que d'un objet spécifique.

30
Mark Byers

Le comportement des deux appels de méthode est identique car ils appellent la même méthode mais en utilisant le nom de classe (Thread dans ce cas) plutôt qu'une instance pour accéder à des champs et des méthodes statiques rend cette statique claire. C'est pourquoi cet avertissement est émis.

Mais étant donné que les champs et méthodes statiques sont affichés d'une manière particulière dans la plupart des IDE (par exemple en italique dans Eclipse et IntelliJ IDEA), cet avertissement est-il toujours nécessaire? Peut-être pas aussi nécessaire qu'au début de Java que de simples éditeurs étaient utilisés.

3
Amir Moghimi

Thread.currentThread().sleep(x); ou la manière Eclipse le dit Thread.sleep(x); un contexte statique est requis s'il est dans le besoin, donc nous nous accrochons pour un léger retard avec ce sommeil.

Le paradigme statique défini par un objet, n'affecte que le cycle de vie de l'impression de tas d'objet particulier, considérant à nouveau que le cycle de vie global de l'objet statique n'est pas si gênant, si nécessaire, il peut être utilisé pour faciliter le codage, mais à faire avec soin en tant que pied statique. print est référencé par Class (par exemple: - Class.forName(pkg.className)) comme par son nom et non par un object qui est une copie d'impression unique de la classe au moment de l'exécution dans HEAP mémoire.

Encore une fois, l'utilisation de l'objet a aussi des avantages et des inconvénients par Weak, Phantom, Strong genre de références ....,

Le code est alambiqué par la nature. C'est juste la façon dont nous le faisons pour le rendre fonctionnel et fonctionnel.

0