Java Learning
18.6K subscribers
1.62K photos
1 video
3 files
1K links
№ 5079899194

Обучающий канал по Java

Ссылка для друга - https://t.iss.one/+ZEYYht6-46w5MDM6

По всем вопросам @mascarov_valentin

Реклама на бирже - https://telega.in/c/Java_per_month
Download Telegram
⚙️ Хотите убедиться, что JVM ничего про них не знает?

Эта программа не только компилируется, но и на самом деле кидает SQLException. Вам даже не нужен SneakyThrows из Lombok'а.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔3
👀 Случайные целочисленные числа

Теперь более трудное задание. Не читайте решение. Посмотрите сможете ли вы найти
ответ самостоятельно. Когда я запущу следующую программу:

for (int i = 0; i < 10; i++) {
System.out.println((Integer) i);
}


Иногда я получаю следующий вывод:

92
221
45
48
236
183
39
193
33
84


➡️ Но как такое вообще возможно? Ответ в кроется в переопределении JDK кеша Integer через рефлексию, и затем в использовании auto-boxing и auto-unboxing.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔5
➡️ Вложенные в интерфейсы классы

Вложенный (nested) в интерфейс класс является открытым (public) и статическим (static) даже без явного указания этих модификаторов. Помещая класс внутрь интерфейса, мы показываем, что он является неотъемлемой частью API этого интерфейса и более нигде не используется.

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

Colorable.Color color = new Colorable.Color(0, 0, 0);
color = new Triangle.Color(255, 255, 255);


🗣️ Самым, наверное, известным примером этой идиомы является класс Map.Entry<K, V>, содержащий пары ключ-значение ассоциативного словаря.

Java Learning 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
👀 У 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