JavaRush /Java блог /Random UA /10 можливостей Java 8, про які ви не чули.
Vash_the_Stampede
11 рівень

10 можливостей Java 8, про які ви не чули.

Стаття з групи Random UA
лямбди, лямбди, лямбди. Це все, про що ви чуєте, коли говорять про Java 8. Але це лише одна частина. Java 8 має безліч нових можливостей - деякі потужні нові класи та ідіоми, а інші лише речі, які повинні були бути з самого початку. Я хотів перейти до десяти нових можливостей, які я розглядаю як маленькі дорогоцінні камені, які, безперечно, варті того, щоб їх знали. Серед них повинні бути хоча б один або два, які ви хотіли б спробувати, тому давайте почнемо! 1) Методи за промовчанням. Нововведення в мові Java, тепер ви можете додавати тіла методів в інтерфейси ( за замовчуванням ). Ці методи беззастережно додаються до всіх класів, що реалізують ці інтерфейси. Це дає вам можливість додавати новий функціонал до існуючих бібліотек, не зіпсувавши старий код. Це напевно плюс. З іншого боку, це серйозно розмиває кордон між інтерфейсом, що зобов'язує дотримуватися певних умов як угоди, і класом, який їм слід як його приватної реалізації. У (прямих) правильних руках це може стати елегантним способом зробити розумніші інтерфейси, уникати повторення і розширити бібліотеки. У поганих руках; Ми скоро будемо бачити методи в інтерфейсах, що викликають це і приводять його до конкретного типу. Бррр .... 2) Зупинка процесів. Запуск додаткового процесу - одна з речей, що ви робите, напів-знаючи, що ви повернетеся (дебажити) налагоджувати її, коли процес (крякне) (пофарбується) перерветься, (повіситься) зависне, або використовує 100% процесора. Тепер клас Process був озброєний двома новими методами, щоб допомогти вам контролювати неслухняні процеси. Перший, isAlive() , дозволяє вам легко перевірити, чи працює процес, без необхідності чекати його. Другий і потужніший (увага!) - destroyForcibly() , який дозволяє вам (безпардонно) примусово (вбити) зупинити процес, який перевищив час (очікування або якесь ще) або більше не потрібен. 3) StampedLock'і. А тепер щось реально цікаве. Ніхто не любить синхронізувати код. Це правильний шлях знизити продуктивність вашої програми (особливо у великих масштабах) або гірше – привести її до зависання. І все-таки, іноді у вас просто немає вибору. Існує безліч ідіом для синхронізації багатопоточного доступу до ресурсу. Одна з найбільш популярних - ReadWriteLock та пов'язані з ним реалізації. Ця ідіома знижує конкуренцію, дозволяючи численним потокам використовувати ресурс, блокуючи лише потоки, що маніпулюють їм. Звучить чудово, але на практиці цей замок такий повільний , особливо при великій кількості потоків, що пишуть. Це виявилося настільки погано, що Java 8 представляє новий RWLock, названий StampedLock . Цей замок не тільки швидше, але також пропонує потужний API для оптимістичного блокування, де ви можете отримати блокування читання малою ціною, сподіваючись, що не відбудеться письмової операції протягом критичних ділянок коду. Наприкінці ділянки ви запитуєте у замку, чи відбувався запис протягом цього часу, у разі чого ви можете вирішити, чи спробувати заново, посаботи (escalate) замок або (здатися) припинити. Цей замок - потужний інструмент і заслуговує на пост цілком про себе. Я запаморочливо схвильований цією новою іграшкою. Чудово! Додатково можете прочитати тут . 4) Конкуруючі записувачі. Це ще один маленький дорогоцінний камінь для будь-якого працюючого з багатопотоковими додатками. Простий та ефективний новий API для читання та запису у лічильники з множинних потоків. Іноді це навіть швидше, ніж використання AtomicIntegers. Досить круто! 5) Необов'язкові (або опціональні) значення. Ох, null-покажчики, головний біль всіх розробників Java. Можливо, найпопулярніше з усіх винятків, воно було з давніх-давен. Принаймні з 1965 року. Позичивши у Scala та Haskell, Java 8 має новий шаблон, названий Optional, для пакування посилань, який може бути null. Це аж ніяк не срібна куля (silver bullet, фразеологізм, означає просте і виглядає магічним рішення для складної проблеми), що покінчить з null, але скоріше засіб для API дизайнерів, щоб позначити на рівні коду (замість документації), що null-значення може бути повернено або передано до методу, і абонент, що викликає, повинен підготуватися до цього. Таким чином, це буде працювати тільки для нових API, за умови, що абоненти, що викликають, не дозволять посиланню втекти з обгортки, де вона може бути небезпечно розіменована. Я повинен сказати, що я досить неоднозначно належу до цієї функції. З одного боку, null'и залишаються величезними проблемами, так що я ціную все зроблене для її вирішення. З іншого боку, я досить скептично ставлюся до того, що це досягне успіху. Це тому, що використання Optional вимагає тривалих зусиль від усієї компанії, і має мало безпосереднього значення. Без сильного примусу є шанси, що це залишиться на лівій стороні дороги. Докладніше про Optional . 6) Анотувати все. Інше невелике просування в мові Java: анотації можуть бути додані майже до всього у вашому коді. Раніше, анотації могли бути додані лише до речей типу класів чи об'яв методів. З Java 8 анотації можуть бути додані до оголошень змінних та параметрів, при наведенні значення до конкретного типу або навіть розміщення нового об'єкта. Це є частиною зосереджених зусиль (поряд з удосконаленням інструментів JavaDoc та API), щоб зробити мову більш дружньою щодо статичного аналізу та вимірювальних інструментів (наприклад, FindBugs). Це хороша особливість, але так само, як і invokeDynamic , введений в Java 7, його реальне значення залежатиме від того, що суспільство зробить з ним. 7) Операції переповнення. Тепер, ось набір методів, які мали бути частиною основної бібліотеки з першого дня. Моє улюблене хобі налагоджувати числові переповнення, коли int'и перевищують 2 ^ 32, і переходити до створення найнеприємніших і найбільш непередбачуваних помилок (тобто "як же я отримую це дивне значення?"). Знову ж таки, тут немає срібних куль, але є безліч функцій для оперування числами, які [функції] викидають при переповненні у менш прощаючому вигляді, ніж ваш стандартний +/* оператор, який беззастережно переповнює. 8) Прохід за каталогом. Перебір вмісту дерева каталогів вже давно є одним з тих, що набивають у Google – пошук (у цьому випадку вам, ймовірно, порадять використовувати Apache.FileUtils). Java 8 зробив класу Files підтяжку обличчя десятьма новими методами. Мій улюблений це walk() , який створює лінивий потік (важливо для великих файлових систем) для перебору вмісту структури каталогу. 9) Сильна генерація випадкових. Там не бракує розмов в даний час про вразливість паролів і ключів. Програмна безпека є складним бізнесом та схильна до помилок. Ось чому мені подобається новий метод SecureRandom. getinstanceStrong() , який автоматично вибирає найсильніший генератор випадкових, доступний для віртуальної машини Java. Це зменшує шанси того, що вам не вдасться отримати, або через слабкий генератор, який зробить ключі і зашифровані значення сприйнятливіші до злому. 10. Date.toInstant(). Java 8 вводить абсолютно новий API для дат та часу . Це досить зрозуміло, тому що існуючий не дуже добрий. Joda (Йода?), по суті, йшов Java API для дат і часу протягом декількох років. Тим не менш, навіть з новим API одна велика проблема залишається - є тонна коду та бібліотек із використанням старої API. І всі ми знаємо, що вони залишаться тут. Так що ви робитимете? Для цього Java 8 зробив щось досить елегантне, додавши новий метод у клас Date на ім'я toInstant() , який перетворює його на новий API. Це дозволяє зробити швидкий стрибок до нового API, навіть при роботі з кодом, який використовує старий API для дат (і продовжуватиме це робити у видимому майбутньому).
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ