Telegram Web Link
👀 У Java есть GOTO!

goto это неиспользуемое зарезервированное слово, просто на всякий
случай…

🗣️ Но это не самая захватывающая часть. Самое интересное то что вы можете включить
goto в паре с break, continue и помеченных блоков


Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😁1🤔1
⚙️ Оптимизация сборщика мусора с помощью -XX:+UseG1GC

Java предоставляет множество возможностей для оптимизации производительности приложений.

✔️ Одной из таких возможностей является использование современного сборщика мусора G1 (Garbage First), который улучшает работу приложений с большим объемом данных и снижает задержки.

➡️ Чтобы включить использование G1GC, необходимо добавить флаг -XX:+UseG1GC при запуске Java-приложения:

java -XX:+UseG1GC G1GCExample


Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
⚙️ Псевдонимы типов

В Java мы не можем просто так определить псевдоним на верхнем уровне. Но мы можем сделать так для потребностей класса либо метода. Давайте предположим что нас не устраивают такие имена как Integer, Long и т.д. и мы хотим имена по короче: I и L. Да легко:

class Test {
void x(I i, L l) {
System.out.println(
i.intValue() + ", " +
l.longValue()
);
}
}


🗣️ В примере выше, Integer преобразован в I для видимости класса Test в то время как Long
преобразован в L для нужд метода х(). Теперь мы можем вызвать этот метод следующим
образом:

new Test().x(1, 2L);


Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10😁21
➡️ Delay Queue

DelayQueue - особый тип коллекции Java для сортировки элементов по времени задержки.

🗣️ Принадлежит пакету java.util.concurrent, реализует интерфейс BlockingQueue. Элементы извлекаются только при истечении задержки. Для использования необходимо реализовать метод getDelay из интерфейса Delayed.

✔️ Допустим, мы хотим задержать элемент на 10 секунд. Нам просто нужно установить текущее время, увеличенное на 10 секунд для нашего класса DelayedEvent.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81😢1
✉️ Улучшение логирования с использованием Java Logging API

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

✔️ Использование Java Logging API (java.util.logging) позволяет гибко настраивать и контролировать логирование в ваших приложениях.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
Что будет выведено при выполнении кода?

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
32%
2
4%
1.8
9%
2.5
56%
2.0
👍141
⚙️ Время суток в Time Format

Java 8 значительно улучшила API обработки времени, и дополнительная библиотека, такая как Joda Time, стала часто не нужна.

✔️ С Java 16 можно даже выражать время суток, например, «утром» или «днем», используя стандартный форматер с новым шаблоном формата B.

Только не спрашивайте, почему он называется B. Кстати, вот фрагмент шаблонных букв и символов, обрабатываемых DateTimeFormatter.


Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
⚙️ Stamped Lock

Java Concurrent - один из самых интересных и в то же время малоизвестных пакетов Java, особенно среди разработчиков, работающих с веб-фреймворками.

🗣️ Lock - более гибкий механизм синхронизации потоков, чем synchronized. Начиная с Java 8, можно использовать StampedLock вместо ReadWriteLock, что обеспечивает лучшую производительность и оптимистичную блокировку операций чтения.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Как правильно использовать утилитарные классы

Утилитарные классы предназначены не для создания объектов, а для предоставления статических методов для выполнения общих функций. Если вы пишете слишком много таких классов, пересмотрите свой подход к проектированию кода.

Однако иногда они необходимы, например, для реализации внутренних предметно-ориентированных языков (DSL) в Java. В таких случаях часто отступают от принципов ООП, чтобы сделать синтаксис короче.

➡️ Если вам все-таки нужно создать утилитарный класс, придерживайтесь следующих рекомендаций:

• Сделайте конструктор приватным, чтобы класс нельзя было создать.
• Сделайте класс final, чтобы его нельзя было наследовать.
• Объединяйте методы в утилитарные классы по функциональности. Избегайте общих названий, таких как MvcUtils или CommonUtils.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
⚙️ Stamped Lock

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

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

🗣️ Новые инструменты для инъекций зависимостей переходят от использования Reflection к генерации кода для улучшения проверки на этапе компиляции.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔4
⚠️ Избегайте конкатенации строк в больших циклах

При добавлении двух строк в цикле (for, while, do-while), использование оператора + приводит к растрате памяти и увеличению времени выполнения.

🗣️ Это происходит из-за создания нового объекта String каждый раз при добавлении новой строки. Лучшей практикой является использование класса StringBuilder.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Что будет выведено при выполнении кода?

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Anonymous Quiz
6%
5
76%
10
4%
true
14%
false
👍101
👀 Map.computeIfAbsent()/getOrDefault()/merge()/putIfAbsent()

Возможно, если вы пишете на Java, то у вас в проекте есть код похожий на этот:

Map<String, Integer> data = ...;
for (String s : strings) {
if (!data.containsKey(key))
data.put(key, 0);
data.put(key, data.get(key) + 1);
}


Суть проста. Есть отображение из строки в счетчик, сколько раз мы встретили эту строку. Надо только не забывать инициализировать позиции Map‘а нулем, а то виртуальная машина в вас NullPointerException кинет.

➡️ В Java 8 эта же задача решается проще:

for (String s : strings)
data.merge(s, 1, (a, b) -> a + b);


Meтод merge принимает ключ, значение и функцию которая объединяет заданное значение и уже существующее в отображении, если таковое имеется. Если в отображении под заданным ключем значения нет, то кладет туда указанное значение.

✔️ Аналогичную функциональность, но в другом контексте, дают методы:

computeIfAbsent() – возвращает или значение из отображения по ключу, или создает его, если его не было;

cputIfAbsent() – добавляет значение в отображение, только если его там не было. Этот метод ранее имелся только у ConcurrentMap, теперь появился и у Map‘а;

cgetOrDefault() – название довольно красноречиво. Возвращает значение из отображения или переданное значение по-умолчанию. На мой взгляд, метод довольно не идиоматичен. Для работы с отсутствующими значениями был добавлен тип Optional, его и следовало использовать. Поэтому, я бы добавил метод: Optional<V> getOptional(K key).

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
➡️ ThreadLocal.withInitial()

Тех, кто плотно работает с многопоточностью, ничем не пронять. Они как ветераны Вьетнама, и даже флешбеки по ночам так же мучают. И этой конструкцией их не напугаешь:

// Java 7 и ранее
ThreadLocal<ObjectMapper> mapper = new ThreadLocal<>() {
@Override
protected ObjectMapper initialValue() {
return new ObjectMapper();
}
};


✔️ Но теперь, за счёт замыканий, стало проще:

// Java 8
ThreadLocal<ObjectMapper> mapper = withInitial(() -> new ObjectMapper());


Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
⚙️ Files.lines()/readAllLines()/BufferedReader.lines()

В Java 8 стало возможным гораздо проще выполнить такую простую задачу как прочитать построчно файл. Это ещё одна задача, которая раньше требовала довольно много кода.

🗣️ Аналогичный метод был добавлен в класс BufferedReader, поэтому теперь Stream’ы доступны поверх любого InputStream‘а.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Парадокс Comparator’а

Если вам нужно написать Comparator для сортировки объектов по возрастанию, обычно он выглядит так:

public class ByScoreComparator implements Comparator<User> {

@Override
public int compare(User u1, User u2) {
return (int) signum(u2.getAge() - u1.getAge());
}
}


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

Теперь это не нужно. Можно использовать ссылки на методы:

Comparator<User> comparator = Comparator
.comparingDouble(User::getAge)
.thenComparing(User::getName);
List<User> hList = ...;
hList.sort(comparator);


🗣️ Такой подход упрощает создание компараторов.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22
⚙️ Instancio

Как вы генерируете тестовые данные в ваших модульных тестах? Instancio поможет нам в этом.

Ее цель — сократить время и количество строк кода, затрачиваемых на ручную настройку данных в модульных тестах. Она создает объекты и заполняет их случайными данными, делая наши тесты более динамичными.

✔️ С помощью Instancio мы можем генерировать случайные данные, но в то же время мы можем установить пользовательские данные в определенном поле.

🔗 Ссылочка на доку

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7😢1
👀 Datafaker

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

🗣️ Это может быть очень полезно при генерации тестовых данных для заполнения базы данных, генерации данных для стресс‑теста или анонимизации данных из производственных сервисов. Давайте включим его в наши зависимости.

🔗 Ссылочка на доку

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
2025/07/09 20:19:19
Back to Top
HTML Embed Code: