eclipse main - Java:Thread.currentThread().Sleep(x)vs.Thread.sleep(x)




pause c# (5)

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

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

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

Thread.currentThread().sleep(x);

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

Thread.sleep(x); 

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


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

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


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

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

Опять же использование объекта также имеет плюсы и минусы от слабых, фантомных, сильных видов ссылок ....,

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


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

someOtherThread.sleep(x);

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


Я думал, что внес свой ответ, чтобы добавить более подробные сведения из Спецификаций.

Во-первых, в чем разница между передачей по ссылке или передачей по значению?

Передача по ссылке означает, что параметр вызываемых функций будет таким же, как переданный аргумент вызывающих (а не значение, а идентификатор - сама переменная).

Передача по значению означает, что параметр вызываемых функций будет копией переданного аргумента вызывающих.

Или из Википедии, на тему пересылки

При оценке по принципу «по вызову» (также называемой «сквозной ссылкой») функция получает неявную ссылку на переменную, используемую как аргумент, а не на копию ее значения. Это обычно означает, что функция может изменять (т. Е. Присваивать) переменную, используемую как аргумент, - то, что будет видно ее вызывающей стороне.

И по вопросу о пропуске

В вызове по значению вычисляется выражение аргумента, и результирующее значение привязывается к соответствующей переменной в функции [...]. Если функция или процедура могут назначать значения своим параметрам, назначается только ее локальная копия [...].

Во-вторых, нам нужно знать, что использует Java в своих методах. В языке спецификация Java состояния

Когда вызывается метод или конструктор (§15.12), значения фактических выражений аргументов инициализируют вновь созданные переменные параметра , каждый из объявленного типа, перед выполнением тела метода или конструктора.

Поэтому он присваивает (или связывает) значение аргумента соответствующей переменной параметра.

Какова ценность аргумента?

Рассмотрим ссылочные типы, в Java Virtual Machine Спецификация состояний

Существует три типа ссылочных типов : типы классов, типы массивов и типы интерфейсов. Их значения - это ссылки на динамически созданные экземпляры классов, массивы или экземпляры классов или массивы, реализующие интерфейсы, соответственно.

Спецификация языка Java также говорится ,

Опорные значения (часто просто ссылки) являются указателями на эти объекты и специальной ссылкой на нуль, которая не ссылается на какой-либо объект.

Значение аргумента (некоторого ссылочного типа) является указателем на объект. Обратите внимание, что переменная, вызов метода с типом возвращаемого типа ссылочного типа и выражение создания экземпляра ( new ...) все разрешаются для значения ссылочного типа.

Так

public void method (String param) {}
...
String var = new String("ref");
method(var);
method(var.toString());
method(new String("ref"));

все связывают значение ссылки на Stringэкземпляр с вновь созданным параметром метода param. Это именно то, что описывает определение pass-by-value. Таким образом, Java передается по значению .

Тот факт, что вы можете следовать ссылке для вызова метода или доступа к полю ссылочного объекта, совершенно не имеет отношения к разговору. Определение pass-by-reference было

Это обычно означает, что функция может изменять (т. Е. Присваивать) переменную, используемую как аргумент, - то, что будет видно ее вызывающей стороне.

В Java изменение переменной означает переназначение. В Java, если вы переназначили переменную в методе, она останется незамеченной для вызывающего. Изменение объекта, на которое ссылается переменная, является совершенно другой концепцией.

Примитивные значения также определены в спецификации виртуальной машины Java, here . Значение типа представляет собой соответствующее значение интеграла или с плавающей запятой, соответствующим образом закодированное (8, 16, 32, 64 и т. Д.).







java eclipse multithreading sleep warnings