JavaRush /Java блог /Random UA /Модифікатори або як накладати чари у світі Java
Petr Gorskin
22 рівень
Москва

Модифікатори або як накладати чари у світі Java

Стаття з групи Random UA
Доброго галактичного часу доби, комради! Це мій перший міжпланетний манускрипт, а оскільки я інженер, трактування деяких понять може проводитися позаземною мовою.
Модифікатори або як накладати чари у світі Java - 1
На мій погляд Java схожа на нескінченний коридор з дверима (package). За кожним з таких дверей є вільний простір та картотека, в якій зберігається гора магічних сувоїв з інструкціями (класів) щодо створення об'єктів. У кожному сувої описується набір характеристик (змінних) і здібностей (методів) - дій (полів), що здійснюються або самим класом, або зібраним на його основі об'єктом. На цьому етапі представимо себе чарівниками і спробуємо створити нову інструкцію (клас). Отже: Модифікатори або як накладати чари у світі Java - 2Випиваємо еліксир мудрості (вивчаємо основи) та приступаємо до написання інструкції. Access та non-access модифікатори Уявімо, що будь-яка інструкція і створюваний на її основі об'єкт, а також його характеристики і здібності спочатку магічно зачаровані, тобто. їм буде присвоєно певні набори модифікаторів. Спробуємо створити посібник із можливих зачарувань.
  1. Модифікатор доступу , який описує доступність класу, об'єкта чи поля — обов'язковий: за його відсутності JVM (це джерело вселенської магії) автоматично присвоює ідентифікатор за промовчанням package.

    Починаючи з другого модифікатора, йдуть non-access модифікатори, які не є обов'язковими, а також можуть конфліктувати один з одним (але про все по порядку).

  2. Модифікатор Static говорить про те, що клас, об'єкт чи поле статичні. Але що це означає? В основному він приміряється до полів.

    Статичні змінні називаються змінними класу та є унікальними для всіх екземплярів даного класу. Статичні методи можуть бути викликані без створення об'єкта, де вони описані. Статичні класи використовуються при вкладенні одного класу в інший і принцип взаємодії внутрішнього класу із зовнішнім схожим з методами (є темою окремої розмови). Також може використовуватися як окремий блок всередині об'єкта.

  3. Модифікатор Final фактично служить змінної вказівкою те що, що вона є константою. Для методів - що вони не можуть бути перевизначені при успадкування, а для класів це вказівка ​​на те, що успадковуватися від нього не можна (immutable).

    Модифікатори static і final застосовні до класів, об'єктів та полів. Однак є модифікатори, які застосовуються лише до деяких з них (або навіть частини, адже і змінна і метод — це поле, але не всі модифікатори можна застосувати до обох). Якщо проводити аналогію, на швидкість можна зачарувати лише черевики та рукавички (щоб швидше рухалися), а от зачаровувати капелюх на швидкість безглуздо (та й Вселенська Наглядова Рада (компілятор) не дасть).

  4. Модифікатор Abstract застосовується тільки до методів і класів . Абстрактний метод – це метод без реалізації (тіла).

    Якщо клас позначається як абстрактний, він містить абстрактні методи, або це робиться для того щоб заборонити створення екземплярів цього класу. Якщо проводити аналогію, серед інструкції можна побачити заголовок "Розмальовка об'єкта", після якого немає опису. Тобто. за цією інструкцією можна створити об'єкт і розфарбувати його теж можна, але в цій інструкції не написано як (пишіть свою інструкцію зі створення червоного об'єкта на основі цього об'єкта і опишіть як його розфарбовувати).

При роботі в багатопотоковому середовищі можуть використовуватися спеціальні модифікатори:
  1. Модифікатор Syncronized використовується лише для методів. Його наявність свідчить у тому, що може одночасно виконувати лише одне поток. Також може використовуватися як окремий блок коду всередині об'єкта (із зазначенням об'єкта синхронізації).

  2. Модифікатор Volatileтільки для змінних . Його рекомендується використовувати для змінних, які можуть одночасно використовуватися кількома потоками. Змінна з таким модифікатором при кожній зміні моментально копіюється з кеша процесора в основну пам'ять, дозволяючи паралельним потокам отримувати «свіже» значення.

    Варто відзначити, що volatile застосовується в тих випадках, коли тільки один потік може записувати в змінну, а решта лише читає з неї. Для решти випадків краще вішати модифікатор synchronized на методи, які записують у волатильну змінну.

  3. Модифікатор Transient​​лише для змінних . Таким модифікатором позначаються змінні, які потрібно пропускати під час серіалізації об'єкта (це такий розумний процес, про який, в принципі, і самостійно почитати можна…)*

    * - дана стаття написана мною на 17 рівні і доти серіалізація як процес описаний не був, тому замість копіпасти я раджу, за необхідності, вивчити його самостійно.

Конфліктуючі пари модифікаторів Крім застосування модифікаторів до різних класів, об'єктів і полів існує також поняття конфліктуючих пар. Допустимо, накладання на шолом чар міцності робить його важким, і одночасно ви хочете зачарувати його на легкість. Одне з іншим не в'яжеться.
  1. Final і Volatile – коли йдеться про змінні, ми не можемо одночасно сказати, що вона фінальна (константа) і що кілька потоків мають можливість її змінити… Адже вона постійна, і в будь-який момент потік може її вважати, але жоден потік не в силах змінити константу (Всесвітня Наглядова Рада не дасть).
  2. Final і Abstract — класи і методи неможливо знайти одночасно абстрактними (що найчастіше передбачає необхідність їх уточнення для реалізації) і фінальними, тобто. незмінними. Виходить, що в інструкції написано, як створити хороший міцний шолом з будь-якого матеріалу (абстрактна частина), але для цього обов'язково не повинно бути отворів (фінальна обов'язкова частина, зміні не підлягає).
  3. Abstract і Static - абстрактний метод не може одночасно бути статичним або синхронізованим. Статичний абстрактний метод не має сенсу, адже мало того, що нічого не робить, так ще й належить цілому класу — марна штука виходить.
  4. Abstract і Syncronized — який сенс синхронізації роботи з методом, який нічого не робить?
Підведення підсумків Отже, опис модифікаторів закінчився, всі конфлікти розібрані і тепер можна закріпити отриманий результат шпаргалкою - схемою зачарувань: Модифікатори або як накладати чари у світі Java - 3На завершення хочу сказати, що написання цієї статті стало реалізацією мого бажання вивчити модифікатори. Успішний досвід чи ні – на ваш суд. Я чекаю на ваші пропозиції щодо її поліпшення/виправлення і, можливо, спільно ми зробимо з неї корисний мануал для джавістів-початківців.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ