JavaRush /Java блог /Random UA /Кава-брейк #109. Найпопулярніші зараз навички в Java-розр...

Кава-брейк #109. Найпопулярніші зараз навички в Java-розробці. 7 порад з Java Optional, щоб позбутися безладу в коді

Стаття з групи Random UA

Найпопулярніші зараз навички в Java-розробці

Джерело: Medium Java залишається однією з найпопулярніших мов програмування, незважаючи на те, що йому майже чверть століття. Тому розумно припустити, що популярність Java продовжуватиме зростати, і в майбутньому Java-розробники побачать ще більший попит з боку роботодавців. Кава-брейк #109.  Найпопулярніші зараз навички в Java-розробці.  7 порад з Java Optional, щоб позбутися безладу в коді - 1Щоб створювати якісні продукти, розробникам необхідно постійно стежити за випуском найновіших інструментів Java та підвищувати свої технічні навички та знання. Нижче ми представляємо шість основних навичок, обов'язкових для Java-розробників.

1. Відмінне знання Java 8

Незважаючи на те, що вже широко застосовуються свіжіші версії Java, всім початківцям Java-розробникам необхідні глибокі знання та досвід роботи з Java 8. Деякі з найбільш корисних функцій Java 8 включають:
  • Стандартні та статичні методи для створення інтерфейсів з реалізацією методів.
  • Функціональний інтерфейс, який має лише один абстрактний метод та допомагає розробникам уникнути додавання інших абстрактних методів.
  • Лямбда-вирази, які допомагають створювати функціональні інтерфейси.
  • Java Stream API для забезпечення паралельного та послідовного виконання.
  • Нові методи в Collection API.
Всі ці функції роблять Java 8 незамінною для функціонального програмування. Функціональне програмування забезпечує паралелізм та стислість коду, а також допомагає створювати високонавантажені програми з оптимізованим кодом. Java 8 також стала основою для оптимізації машинного коду, що дозволило оптимізувати розробку іншими мовами, таких як Scala, Kotlin та Grails.

2. Досвід роботи із тестуванням

Модульне тестування Java — досить спірна тема. Деякі розробники стверджують, що написання юніт-тестів — марна трата часу, але ми твердо переконані, що навички юніт-тестування є обов'язковими для будь-якого професійного Java-розробника. Модульне тестування дозволяє тестувати окремі блоки коду та гарантує, що кінцевий продукт працюватиме без помилок. Тому, якщо розробник хоче підвищити свої навички та знання, йому необхідно навчитися використовувати найпопулярніші та найефективніші інструменти тестування. Основним середовищем тестування, з яким вам потрібно близько познайомитися, є бібліотека JUnit 5. До списку інших інструментів входить:
  • Robot Framework
  • Mockito
  • PowerMock
Крім модульного тестування, Java-розробник не повинен забувати про інші методи тестування (системне тестування, приймальне тестування та інтеграційне тестування). Це дозволяє виконати комплексне тестування програмного забезпечення та переконатися у відсутності помилок, багів чи критичних збоїв. Головне, що слід пам'ятати про тестування: невеликі зміни призводять до більших результатів. Якщо ви, не вагаючись, витратите час та зусилля на модульне тестування, ви будете вражені підвищенням якості своєї роботи.

3. DevOps

Хоча це не є обов'язковим пунктом, вивчення DevOps та його принципів може бути корисним для вас як розробника, так і для компанії, де ви працюєте. Гнучкість та організація процесів DevOps дозволяють компаніям оптимізувати якість свого продукту та раціоналізувати операції. а також підвищити прозорість процесів. DevOps в Java - це, по суті, додаток DevOps до розробки Java. До нього належить:
  • Безперервна доставка та інтеграція.
  • Робота із мікросервісами замість монолітів.
  • Інфраструктура як код.
  • Автоматизоване випробування.
DevOps - велика область, тому для її вивчення необхідно витратити значну кількість часу та ресурсів. Але якщо ви є Java-розробником, вивчення DevOps буде корисним, оскільки воно дозволить вам у майбутньому стати інженером DevOps. Якщо ви не хочете ставати інженером DevOps або ваша компанія не зацікавлена ​​в цьому, це теж нормально. Просто майте на увазі, що DevOps стає все популярнішим у спільноті Java.

4. Знання бібліотек Java та API.

Оскільки Java є однією з провідних мов програмування у світі, не дивно, що вона має величезну кількість доступних API та бібліотек для роботи. Ці інструменти значно полегшують процес розробки та дозволяють розробникам швидко створювати надійне програмне забезпечення. Нижче ми перерахували базовий набір інструментів, які знає і може впевнено використовувати будь-який Java-розробник. Ці інструменти допомагають швидко зібрати програму та ефективно керувати даними та їх сховищем:
  • Gradle (інструмент для збирання додатків);
  • Maven (трохи застарілий, але все ще популярний, також використовується для збирання додатків);
  • стандартні пакети Java 8;
  • Spring Фреймворкі;
  • JPA ORM (Hibernate, TopLink);
  • Бази даних NoSQL (MongoDB, Cassandra).
Що стосується API, то для роботи з основним API Java розробнику необхідно добре знати OpenJDK, Android, Oracle та IS2T. Великою перевагою цих інструментів є те, що всі вони постачаються з детальною та інформативною документацією. Більше того, розробники завжди можуть отримати підтримку спільноти, що також є великою перевагою.

5. Впевнене знання Spring та Spring Boot

Spring Framework є найчастіше використовуваним середовищем розробки додатків на основі Java, тому важливо, щоб розробник знав, як із нею працювати. Однією з ключових переваг Spring є впровадження залежностей, яке дозволяє створювати слабко пов'язані програми та надає розробникам більшу гнучкість. Spring також дуже легкий, підтримує конфігурації XML, анотації та декларативне програмування. Тому, якщо ви хочете опанувати навички розробки на Java, ви також повинні освоїти розгортання Spring. Spring Boot - це ітерація Spring, яка є зручним інструментом для швидкого розгортання додатків. Можна з упевненістю сказати, що Spring Boot використовує Spring як основу та будує на ньому свої власні функції. У той час як Spring орієнтований на гнучкість, Spring Boot допомагає скоротити код та спрощує процес розробки. Він пропонує розробникам готові до роботи функції, допомагає створювати автономні програми та загалом простіше у запуску та управлінні. Spring Boot відмінно підходить для мікросервісів та додатків, які необхідно швидко створити, оскільки він забезпечує швидке та просте налаштування та запуск додатків для різних середовищ (виробництво, тестування, якість, CI/CD). І Spring, і Spring Boot розширабося за рахунок можливостей програмування React, що є ще однією гарячою тенденцією спільноти розробників. Spring 5, наприклад, тепер має WebFlux для реалізації реактивного підходу до програмування та вирішення складних розподілених систем.

6. Досвід роботи з Big Data

Big Data — це тенденція, що зростає, якої розробники повинні слідувати і переймати, щоб відповідати вимогам ринку. Основні інструменти, з якими можуть ознайомитися професійні Java-розробники:
  • Apache Spark
  • Apache Kafka
  • Hadoop (для пакетної обробки даних)
Apache Spark - це розподілена платформа для обробки Big Data, що надає власні прив'язки Java. Цей фреймворк став надзвичайно популярним завдяки своїм функціям та продуктивності і в даний час є найкращим інструментом для роботи з великими даними у спільноті Java. Apache Spark може працювати в автономному режимі кластера, і для цього вам знадобиться лише середовище Apache Spark та JVM (для кожної машини в кластері). Spark також неймовірно швидкий та має дуже зручний Spark API. Hadoop це платформа для зберігання даних, яка також добре відома розробникам Java. Хоча Hadoop поступається за швидкістю виконання Spark, він залишається одним із найпопулярніших інструментів для роботи з великими даними. Це також пов'язано з тим, що Hadoop (і подібні рішення) мають велику кількість плагінів, які дозволяють ефективно вирішувати завдання обробки Big Data та в цілому оптимізувати продуктивність Hadoop (включаючи підтримку потокової обробки в реальному часі).

7 порад з Java Optional, щоб позбутися безладу в коді

Джерело: Medium "У мене є колеги, які не знають про існування Optional", - пише один Java-розробник на Reddit. Чи можна вважати, що Optional покращує “читабельність” коду? Чи варто його постійно використовувати? Де застосування Optional зовсім не потрібне? Оскільки багато розробників досі не знають, як правильно використовувати Optional, я наведу 7 прикладів зловживань Optional і що з ними робити. Кава-брейк #109.  Найпопулярніші зараз навички в Java-розробці.  7 порад з Java Optional, щоб позбутися безладу в коді - 2

1. Не використовуйте Optional для null check

Використання Optional замість null check лише додає безладдя. Жодної користі від цього немає. Помилково також застосовувати Optional і методи isPresent і get . Розробники вважають, що get має працювати так, як від нього очікується. Потім вони додають isPresent і повертаються до null check. Пам'ятайте, що Optional не виправляє ваш null check. Наступного разу, коли ви побачите isPresent і get (або ElseThrow ), змініть цей фрагмент коду. Використовуйте зіставлення (mapping) і orElse , щоб видалити стандартні null check, і використовуйте Optional більш вибірково. Ось один добрий приклад:
var user = userService.getCurrentUser();
if(user == null) {
    return "(unknown)";
}
var username = user.getUsername();
if (username == null) {
    return "(unknown)";
}
return username;
vs

var user = userService.getCurrentUser();
if(user.isEmpty()) {
    return "(unknown)";
}
var username = user.orElseThrow().getUsername();
if (username == null) {
    return "(unknown)";
}
return username;
vs

return userService.getCurrentUser()
                  .map(User::getUsername)
                  .orElse("(unknown)");
Ви можете почати з мети Optional. Ціль Optional полягає в тому, щоб представити необов'язкові, відсутні значення. Потім поверніться до своєї проблеми і подивіться, чи це вам підходить. Ще один спосіб впоратися з null check – використовувати інструкції. Nullable або NotNull повинні працювати добре. Щоправда, вони можуть забруднити ваш код, і вони захищають лише під час компіляції. Для перевірки runtime використовуйте Objects.requireNonNull .

2. Виконуйте правильну обробку помилок

Іноді null представляє винятки. І це неправильний спосіб сигналізувати про помилки та винятки. "Щось пішло не так, і ось null", - анти-шаблон, якого слід уникати. Крім того, ви не повинні використовувати Optional для покриття винятків. Ось приклад.
public Optional<MyObject> getMyObject(final String jql) {
    try {
        return Optional.ofNullable(get(sql));
    } catch (final JqlParseException e) {
        return Optional.empty();
    }
}
Чому myObject порожній (empty)? Це або помилка, або пусте значення. Тому ви знову отримали б неоднозначний результат і в результаті стерли переваги Optional. Цей код існує, оскільки люди намагаються використовувати Optional для потоку керування (control flow). Optional видаляє деякі нулі у вашій кодовій базі. Але вам все ще потрібно використати конструкцію try-catch для обробки винятків. Використовуйте try-catch для правильної обробки винятків. Не видаляйте Optional під час обробки помилок, просто зачекайте, і він буде працювати ідеально. Але тут є один виняток – empty catch . Коли ви не знаєте, що повертати в empty catch, порожнє значення Optional має працювати нормально.
private int readExpirationAsInt(Milk milk)
{
  String expiration = milk.getExpiration();
  try {
    return Integer.parseInt(expiration);
  }
  catch(NumberFormatException ignored) {}

  return 0;
}


private OptionalInt readExpirationAsInt(Milk milk)
{
  String expiration = milk.getExpiration();

  try {
    return Optional.of(Integer.parseInt(expiration));
  }
  catch(NumberFormatException e) {
    return OptionalInt.empty();
  }
}

3. Не повертайте null із методів Optional

public static Optional<POSType> getPOSType(String posName) {
    if (StringUtils.isNotBlank(posName)) {
        return Arrays.stream(POSType.values())
                .filter(type -> type.toString().equalsIgnoreCase(posName))
                .findFirst();
    }
    return null;
}
Це суперечить меті Optional. Це ще один приклад поганої перевірки. Оскільки введення порожнє, це означає, що нам потрібний файл IllegalArgumentException . З іншого боку, це помилка. Нікому не потрібно перевіряти методи виклику Optional. Повертайте порожній елемент Optional та ніколи не перевіряйте елемент Optional на null.

4. Не використовуйте Optional із колекціями.

Немає необхідності обертати (wrap) колекції в Optional. Більше того, не розміщуйте Optionals в колекції. Це тільки ускладнює, додаючи безглузде boxing та додаткове розгортання (unwrapping). Не додавайте Optionals до колекції. Очевидної користі від цього немає. Зберігайте простоту та використовуйте Optional для відсутніх значень.

5. Не прив'язуйтесь заради прив'язки (Don't chain for the sake of chaining)

Optional.ofNullable(foo).ifPresent(value -> {
  //do something
})
Optional має докладні методи, які можуть допомогти цьому. Замість chain буде достатньо простого null check. Я знаю, що Optional є хороші методи та хороша підтримка IDE. Ви можете використовувати їх.

6. Використовуйте примітивні оболонки значень

Це не дуже велика проблема, але можна використовувати OptionalInt або OptionalLong . Просто видаливши непотрібні дженерики, ви покращите продуктивність і напишіть коротший код.

7. Ви повинні знати проNullable

if (a==null){
  return Optional.empty();
} else {
  return Optional.of(a);
}
Такий код зазвичай пишуть розробники, які не знають про Optional # of Nullable . Більшість розробників навіть не розуміють різниці між Nullable і of . Вони не розуміють, як Optional#of може мати неприємні наслідки. Більшість вдалася б доNullable , побоюючись виключення NullPointerException в Optional#of . Знову ж таки, це суперечить меті цих двох методів. Якщо ми використовуємо тільки ofNullable , навіщо взагалі потрібний Optional#of ? Optional#of викидає NPE, коли ви проходите в null. Це відбувається не так. Цей метод слід використовувати, коли ви очікуєте, що значення буде присутнє. Якщо його немає, він швидко вийде з ладу. Optional#ofNullable перетворює null на порожній Optional. Цей метод приймає null як аргумент, який зіставляється з порожнім Optional.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ