У мене це є в коді
Thread.currentThread().sleep(x);
Eclipse каже мені використовувати статику
Thread.sleep(x);
натомість, чому? У чому різниця, чи існує якась різниця у функціональності взагалі між цими 2 методами?
У мене це є в коді
Thread.currentThread().sleep(x);
Eclipse каже мені використовувати статику
Thread.sleep(x);
натомість, чому? У чому різниця, чи існує якась різниця у функціональності взагалі між цими 2 методами?
Відповіді:
Існує лише один метод, а не два, і він статичний. Хоча ви можете викликати статичний метод через посилання на екземпляр, це невдалий стиль. Це вказує на те, що програміст вважає, що він або вона викликає метод екземпляра. Розгублений програміст може думати, що він або вона можуть спричинити сплячий інший потік (не поточний) таким чином, коли це не те, що він робить.
Обидва ваші рядки коду роблять те саме, але другий - кращий стиль.
У Java сон - це статичний метод. Обидва ваші приклади роблять абсолютно те саме, але попередня версія заплутана, оскільки схоже, що вона викликає метод для певного об'єкта, але взагалі цього не робить. У вашому прикладі це не матиме великого значення, але більш небезпечно, якщо у вас є таке:
someOtherThread.sleep(x);
Цього разу виглядає так, ніби ви просите спати якусь іншу нитку, але насправді ви присипляєте поточну нитку. Спосіб уникнути помилок такого типу - це завжди викликати статичні методи, використовуючи клас, а не конкретний об’єкт.
Два виклики методів однакові за поведінкою, оскільки вони викликають один і той же метод, але використання імені класу ( у цьому випадку Thread ), а не екземпляра для доступу до статичних полів та методів, робить цю статичність зрозумілою. Ось чому дається це попередження.
Але враховуючи, що статичні поля та методи відображаються у більшості середовищ розробки ID (зокрема, курсивом у Eclipse та IntelliJ IDEA), чи є це застереження все-таки необхідним? Можливо, не настільки необхідним, як це було на початку Java, коли використовувались прості редактори.
Thread.currentThread().sleep(x);
або те, як Eclipse каже, що Thread.sleep(x);
статичний контекст потрібен, якщо він потрібен, тому ми тримаємось на невелику затримку з цим сном.
Статична парадигма, встановлена одним об'єктом, впливає лише на той конкретний життєвий цикл друку купи об'єкта, знову ж враховуючи загальну статичність життєвого циклу об'єкта, це не так докучає, якщо це потрібно, його можна використовувати для полегшення кодування, але робити це обережно, як статичну ногу. друк посилається на Class
(наприклад: - Class.forName(pkg.className)
) як на ім'я, а не на будь-яку, object
яка є одноразовою копією класу під час виконання в HEAP
пам'яті.
Знову ж таки, використання об’єкта також має плюси і мінуси слабких, фантомних, сильних посилань ....,
Кодекс заплутаний природою. Це просто спосіб, як ми робимо, щоб зробити його функціонувати та функціонувати.