Лайфхаки при использовании Java

Упрощение и сокращение шаблонного кода, работа с переменными и атрибутами класса, параметризованные тесты и полезные плагины — наши преподаватели поделились полезными советами, которые помогут тем, кто изучает Java.

  • Используйте Lombok

Java — отличный язык, только многословный. С целью сократить шаблонный код (например, геттеры и сеттеры) был создан проект Lombok. Это основанная на аннотациях библиотека Java. Примеры полезных аннотаций:

@Data — генерирует конструктор, геттеры, сеттеры, методы equals, hashCode, toString.

@Builder — генерирует методы, которыми мы инициализируем объект по цепочке. Это удобно, если мы не хотим использовать конструктор со всеми параметрами.

  • Используйте Lombok осознанно

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

Например, используя аннотацию @Data мы должны помнить, что она включает в себя аннотацию @EqualsAndHashCode, которая по умолчанию использует в методе hashCode все атрибуты класса. А если какой-то из атрибутов ссылается на наш класс, это может привести к бесконечной рекурсии. 

  • Разница orElse() vs orElseGet()

Многим программистам, которые только начинают работать с Optional или Java 8, разница между orElse() и orElseGet() непонятна. Однако между ними есть тонкое, но важное различие:

А) Вариант с orElse(). При выполнении метода в консоль выведется 'Getting Default Value', несмотря на то, что объект в Optional присутствует.

Б) При использовании orElseGet() для извлечения обернутого значения метод getDefaultValue() не вызывается, поскольку содержащееся значение присутствует.

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

 

  • Делайте все переменные final

По умолчанию делайте все локальные переменные final. Исключение — если по логике эта переменная должна изменяться в последующем коде. Однако, переменных, которые мы инициализируем один раз и далее не изменяем, как правило, большинство.

То же правило можно отнести и к атрибутам класса — по умолчанию их также лучше делать final, если мы хотим сделать состояние класса неизменяемым и потокобезопасным.

Разумеется, если по логике предполагается изменение состояния класса, изменяемые атрибуты не должны быть финальными.

  • Разница создания списка при помощи List.of() Arrays.asList()

Понимание различий между List.of() и Arrays.asList() важно для любого Java-разработчика. List.of() — это фабричный метод, впервые представленный в Java 9, который создает неизменяемый список, содержащий указанные элементы.

— Неизменяемость: список, созданный List.of(), имеет фиксированный размер и не поддерживает добавление или удаление элементов. При попытке добавить или удалить элемент будет выброшено UnsupportedOperationException.

— Null значения: List.of() не допускает null элементов. Если вы попытаетесь добавить null, появится исключение NullPointerException.

Пример использования:

Для создания изменяемого списка следует использовать Arrays.asList()

В отличие от List.of(), Arrays.asList() допускает нулевые элементы.

  • Используйте параметризованные тесты

Использование тестов с параметрами позволяет значительно увеличить качество и процент покрытия тестов без разрастания объема кода. Для того чтобы протестировать метод с различными параметрами, теперь не нужно писать несколько разных тестов — достаточно написать один, и передать ему все необходимые параметры на вход. 

  • Используйте плагин checkstyle

Подключить его очень легко и в Gradle, и в Maven.

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

 

  • Преобразование коллекций

Новичкам зачастую трудно представить выгоду от использования Stream API вместо обычных циклов. Приведем несколько примеров, которые позволят вам сделать код лаконичнее. 

Сгруппировать сотрудников по их должности:

На Kotlin выглядит еще лаконичнее:

Создать ассоциативный массив, где ключом будет являться id сотрудника для быстрого получения Employee в будущем:

И на Kotlin: 

  • «Kotlin — новый язык программирования, который заставит вас отказаться от Java»

Если вы backend Java-разработчик, знаете Spring и проектируете микросервисы со сложной бизнес-логикой, обязательно попробуйте писать на Kotlin. Kotlin полностью совместим со всеми библиотеками и фреймворками Java, включая Spring.

Большинство команд разработки, перешедших с Java на Kotlin, делают следующие выводы:

— Код более лаконичен, то есть вы сможете писать и поддерживать меньшее количество кода;

— Код более безопасный, поскольку язык заставляет вас думать о (не)изменяемости, nullability и т.д. во время написания кода;

— Вышесказанное также ускоряет развитие. Вам становится проще делать сложные вещи;

Большое и растущее сообщество. Существующие библиотеки поддерживаются или мигрируют в Kotlin, интернет переполнен постами в блогах, видео, презентациями и конечно же, вопросами и ответами на StackOverflow. 

 

Где ещё получить знания

Скоро в нашей Академии разработки MediaSoft стартует продвинутый курс по Spring. Уже открыта регистрация и доступно тестовое задание, подробности по ссылке: https://academy.mediasoft.team/education/spring/

Также приглашаем вас 16 марта на MediaSoft Java Weekend в Самаре — митап для Java-разработчиков и тех, кто хочет ими стать. Подробная информация и регистрация по ссылке: https://mediasoft.timepad.ru/event/2767439/