Используйте DTO для запросов и ответов
Никогда не передавайте сущности напрямую — всегда преобразовывайте их в DTO и обратно
🤍 — база
👉 Java Portal
Никогда не передавайте сущности напрямую — всегда преобразовывайте их в DTO и обратно
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
JDK 22 представил класс
Вывод:
Также можно использовать ListFormat для разбора отформатированной строки обратно в список
Ставь лайк если полезно🪑
👉 Java Portal
java.text.ListFormat
. Используйте его, когда нужно отформатировать список строк в удобочитаемый вид. Например, вот такая программа:final List<String> days = List.of("Mon", "Wed", "Fri");
void main() {
print(Type.STANDARD);
print(Type.OR);
print(Type.UNIT);
}
private void print(Type type) {
print(type, Style.FULL);
print(type, Style.SHORT);
print(type, Style.NARROW);
}
private void print(Type type, Style style) {
var format = ListFormat.getInstance(Locale.US, type, style);
var result = format.format(days);
System.out.printf("%-8s + %-7s: %s%n", type, style, result);
}
Вывод:
STANDARD + FULL : Mon, Wed, and Fri
STANDARD + SHORT : Mon, Wed, & Fri
STANDARD + NARROW : Mon, Wed, Fri
OR + FULL : Mon, Wed, or Fri
OR + SHORT : Mon, Wed, or Fri
OR + NARROW : Mon, Wed, or Fri
UNIT + FULL : Mon, Wed, Fri
UNIT + SHORT : Mon, Wed, Fri
UNIT + NARROW : Mon Wed Fri
Также можно использовать ListFormat для разбора отформатированной строки обратно в список
Ставь лайк если полезно
Please open Telegram to view this post
VIEW IN TELEGRAM
Способы сравнения строк в Java
1.
2.
3.
4.
> Подробнее тут😊
👉 Java Portal
1.
==
→ Сравнивает адреса в памяти2.
.equals()
→ Сравнивает содержимое строк3.
.compareTo()
→ Лексикографическое сравнение4.
.equalsIgnoreCase()
→ Сравнивает без учёта регистра> Подробнее тут
Please open Telegram to view this post
VIEW IN TELEGRAM
В Java можно ставить метку на выражение, которое уже промечено другой меткой. И так хоть до бесконечности.
Полезно? Вряд ли.
Стоит ли использовать? Точно нет.
Но как факт — это работает
Пример:
> Код компилируется
> Метки (
Вывод:
Иногда Java действительно говорит с нами стихами🫢
👉 Java Portal
Полезно? Вряд ли.
Стоит ли использовать? Точно нет.
Но как факт — это работает
Пример:
String question;
to: be: or: not: that: is: the: question = "What?";
out.println(question);
> Код компилируется
> Метки (
to:, be:, or:
и т.д.) игнорируются, если не используются в break
или continue
Вывод:
What?
Иногда Java действительно говорит с нами стихами
Please open Telegram to view this post
VIEW IN TELEGRAM
В чём разница между throw и throws в Java?
throw
> Используется для явного выбрасывания исключения.
> Синтаксис: throw new ExceptionType("сообщение");
> Применяется внутри метода или блока.
throws
> Объявляет возможные исключения, которые может выбросить метод.
> Указывается в сигнатуре метода.
> В основном используется для проверяемых исключений
👉 Java Portal
throw
> Используется для явного выбрасывания исключения.
> Синтаксис: throw new ExceptionType("сообщение");
> Применяется внутри метода или блока.
throws
> Объявляет возможные исключения, которые может выбросить метод.
> Указывается в сигнатуре метода.
> В основном используется для проверяемых исключений
Please open Telegram to view this post
VIEW IN TELEGRAM
Этот Dockerfile для Spring Boot создаёт образ, который потребляет на 33% меньше памяти по сравнению с образом, собранным с помощью Buildpacks (рекомендуемый Spring способ сборки Docker-образов) 💪
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Хочешь чистые REST API на Java?
Используй:
>
>
>
>
Spring REST помогает писать код просто и понятно🧑💻
👉 Java Portal
Используй:
>
@RestController
>
@RequestBody
>
@PathVariable
>
@ResponseStatus
Spring REST помогает писать код просто и понятно
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое
> Состоит из узлов, где каждый узел содержит данные и ссылки на следующий и предыдущий узлы
> Быстрые вставки и удаления — O(1), если есть ссылка на нужный узел
> Медленный доступ по индексу — O(n), т.к. нужно проходить список последовательно
🔧 Когда использовать:
> Частые вставки и удаления — особенно в начале или в середине списка
> Реализация очередей и деков — удобно добавлять в конец и забирать из начала
> Работа с большими объёмами данных, где перераспределение памяти (как в
> Undo/Redo-механизмы — например, в текстовых редакторах, где нужно быстро добавлять и удалять действия из истории
👉 Java Portal
LinkedList
(двусвязный список) в Java?> Состоит из узлов, где каждый узел содержит данные и ссылки на следующий и предыдущий узлы
> Быстрые вставки и удаления — O(1), если есть ссылка на нужный узел
> Медленный доступ по индексу — O(n), т.к. нужно проходить список последовательно
> Частые вставки и удаления — особенно в начале или в середине списка
> Реализация очередей и деков — удобно добавлять в конец и забирать из начала
> Работа с большими объёмами данных, где перераспределение памяти (как в
ArrayList
) может быть дорогим. LinkedList
не требует непрерывной памяти> Undo/Redo-механизмы — например, в текстовых редакторах, где нужно быстро добавлять и удалять действия из истории
Please open Telegram to view this post
VIEW IN TELEGRAM
Метод
Он позволяет обращаться к содержимому файла, например ZIP-архива, как к файловой системе.
Пример Java-программы:
Результат выполнения:
До появления этого метода нужно было использовать более сложный код с URI и явно указывать схему:
👉 Java Portal
FileSystems.newFileSystem(Path)
появился ещё в JDK 13 (2019), но многие до сих пор о нём не знаютОн позволяет обращаться к содержимому файла, например ZIP-архива, как к файловой системе.
Пример Java-программы:
void main() {
Path src = Path.of("/opt/jdk-24/lib/src.zip");
try (FileSystem fs = FileSystems.newFileSystem(src)) {
for (Path root : fs.getRootDirectories()) {
try (Stream<Path> walk = Files.walk(root, 1)) {
walk.sorted().forEach(IO::println);
}
}
}
}
Результат выполнения:
/
/java.base
/java.compiler
/java.datatransfer
/java.desktop
/java.instrument
/java.logging
...
/jdk.unsupported
/jdk.unsupported.desktop
/jdk.xml.dom
/jdk.zipfs
До появления этого метода нужно было использовать более сложный код с URI и явно указывать схему:
URI src = URI.create("jar:file:///opt/jdk-24/lib/src.zip");
try (FileSystem fs = FileSystems.newFileSystem(src, Map.of())) {
...
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Java с JMH для бенчмарков
Создай класс-бенчмарк, чтобы замерить производительность нужного кода😈
👉 Java Portal
Создай класс-бенчмарк, чтобы замерить производительность нужного кода
Please open Telegram to view this post
VIEW IN TELEGRAM
Утечки памяти из-за загрузчика классов в Java
Java-приложения могут терять память из-за цепочек загрузчиков классов, когда статические ссылки мешают сборщику мусора удалить старые загрузчики.
Такое часто происходит при повторном деплое на серверах вроде Tomcat — и приводит к скрытым, трудноуловимым утечкам памяти🍔
👉 Java Portal
Java-приложения могут терять память из-за цепочек загрузчиков классов, когда статические ссылки мешают сборщику мусора удалить старые загрузчики.
Такое часто происходит при повторном деплое на серверах вроде Tomcat — и приводит к скрытым, трудноуловимым утечкам памяти
Please open Telegram to view this post
VIEW IN TELEGRAM
Внутренности Java switch
Как компилятор выбирает, какую инструкцию использовать?
Первое, что нужно знать: любой switch в Java компилируется в одну из двух JVM-инструкций:
>
>
Прежде чем разбирать, как работает каждая из них, давайте посмотрим, как компилятор решает, какую выбрать.
Следующий код сгенерирует
А вот этот код сгенерирует
Видишь разницу?
👍 — да. вижу
🔥 — нужно разбирать
👉 Java Portal
Как компилятор выбирает, какую инструкцию использовать?
Первое, что нужно знать: любой switch в Java компилируется в одну из двух JVM-инструкций:
>
tableswitch
>
lookupswitch
Прежде чем разбирать, как работает каждая из них, давайте посмотрим, как компилятор решает, какую выбрать.
Следующий код сгенерирует
tableswitch
:public String tableSwitch() {
return switch (value) {
case 1 -> "one";
case 2 -> "two";
case 4 -> "four";
default -> "other";
};
}
А вот этот код сгенерирует
lookupswitch
:public String lookupSwitch() {
return switch (value) {
case 1 -> "one";
case 10 -> "ten";
case 100 -> "one hundred";
default -> "other";
};
}
Видишь разницу?
👍 — да. вижу
🔥 — нужно разбирать
Please open Telegram to view this post
VIEW IN TELEGRAM
Держите шикарный разбор, как работает
Что из них выберет компилятор — зависит от распределения case-ов
Автор показал, как это работает на байткоде > дизассемблирует, сравнивает варианты и объясняет, почему структура switch влияет на производительность
Очень наглядно и технически. Удачи🙈
👉 Java Portal
switch
в Java на уровне JVMЧто из них выберет компилятор — зависит от распределения case-ов
Автор показал, как это работает на байткоде > дизассемблирует, сравнивает варианты и объясняет, почему структура switch влияет на производительность
Очень наглядно и технически. Удачи
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring WebFlux с Server-Sent Events
Улучшай real-time приложения с помощью Spring WebFlux и Server-Sent Events🔥
👉 Java Portal
Улучшай real-time приложения с помощью Spring WebFlux и Server-Sent Events
Please open Telegram to view this post
VIEW IN TELEGRAM
Java-разработчики, готовы контейнеризировать свои приложения как профи?
Вот универсальный гайд по основным командам Docker — специально для вас
От сборки до деплоя — всё в одном сниппете
❤️
👉 Java Portal
Вот универсальный гайд по основным командам Docker — специально для вас
От сборки до деплоя — всё в одном сниппете
Please open Telegram to view this post
VIEW IN TELEGRAM
Совет для IntelliJ — свой значок проекта 👩💻
Можно задать кастомную иконку для проекта в IntelliJ — она будет отображаться на экране приветствия
👉 Java Portal
Можно задать кастомную иконку для проекта в IntelliJ — она будет отображаться на экране приветствия
Please open Telegram to view this post
VIEW IN TELEGRAM
Ты создаёшь Java-класс для генерации 128-битных токенов, поэтому пишешь следующий тест:
Что мы должны написать в проверках (assert)? Мы могли бы использовать обычный экземпляр
Другой вариант — заменить тип Random на интерфейс
Где
Интерфейс
🔥— всё верно
👍— если пост оказался полезным
👉 Java Portal
Random random = new SecureRandom();
Tokens tokens = new Tokens(random);
Token result = tokens.next();
assertEquals(result.high(), ???);
assertEquals(result.low(), ???);
Что мы должны написать в проверках (assert)? Мы могли бы использовать обычный экземпляр
Random
с заданным сидом.Другой вариант — заменить тип Random на интерфейс
RandomGenerator
:RandomGenerator generator = fixedGenerator(1L, 2L);
Tokens tokens = new Tokens(generator);
Token result = tokens.next();
assertEquals(result.high(), 1L);
assertEquals(result.low(), 2L);
Где
fixedGenerator
выглядит следующим образом:private RandomGenerator fixedGenerator(long... longs) {
return new RandomGenerator() {
private final long[] values = longs.clone();
private int index;
@Override
public final long nextLong() {
int currentIndex = index++;
if (index == values.length) {
index = 0;
}
return values[currentIndex];
}
};
}
Интерфейс
java.util.random.RandomGenerator
был добавлен в JDK 17 и реализуется классом java.util.Random
🔥— всё верно
👍— если пост оказался полезным
Please open Telegram to view this post
VIEW IN TELEGRAM