Как избавиться от этого «статический метод должен быть доступен статическим способом» в Java? - PullRequest
5 голосов
/ 04 октября 2011

У меня есть следующий фрагмент кода в Java-приложении

Thread.currentThread().sleep(10000);

Однако затмение показывает мне следующее предупреждение:

The static method sleep(long) from the type Thread should be accessed in a static way

Я очень горжусь тем, что никогда не выпускаю код с предупреждениями, и я хотел бы избавиться от этого предупреждения (оно встречается в двух разных классах). Нужно ли публиковать весь код?

Ответы [ 5 ]

32 голосов
/ 04 октября 2011

Звоните

Thread.sleep(10000);

Это всегда заставляет текущий поток спать. Даже если вы сделали:

Thread t = new Thread(...);
t.start();
t.sleep(10000);

Это все еще заставит текущий поток спать в течение 10 секунд, оставляя новый поток, чтобы продолжить свой веселый путь. Это почти канонический пример того, почему это предупреждение важно - это потому, что вы вызываете статический метод , как если бы это был метод экземпляра, что делает его look как будто это имеет значение, на что ты это называешь. Это не так. Значение даже не проверяется на ничтожность:

Thread t = null;
t.sleep(10000); // Still sleeps for 10 seconds...

(Я с гордостью могу сказать, что первоначально отправил запрос о функции для этого предупреждения в Eclipse еще в июне 2002 года:)

3 голосов
/ 04 октября 2011

Да, когда вы смотрите на документ для сна (), он говорит: «статический бессильный сон (длинный миллис)».«Статика» отсутствует из-за шума в канале, это означает, что метод должен быть адресован Thread.sleep(...) вместо someThreadObject.sleep(...).В качестве «удобства» вы можете использовать последнюю форму, но она настоятельно не рекомендуется.

3 голосов
/ 04 октября 2011

Thread.sleep(...) (статический метод в Thread).

Заставляет выполняющийся в данный момент поток спать ...

Нет смысла просить другой поток перевести в спящий режим: его статическое состояние обеспечивает это ограничение (хотя и «только с предупреждением»).

Код в посте будет компилироваться , потому что obj.sm переписывается компилятором в T.sm, где sm - статический метод для класса T и тип времени компиляции из obj равен T: как таковой вызывается статический метод, а не метод экземпляра (для определенного потока), о чем и говорится в предупреждении.

Счастливого кодирования.

2 голосов
/ 04 октября 2011

Просто позвоните Thread.sleep(10000), это приведет к тому, что текущий поток перейдет в спящий режим.http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html#sleep(long)

2 голосов
/ 04 октября 2011

Путь - это

Thread.sleep(10000);

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

...