Совет Spring Framework💡
Вы можете автосопрягать несколько бинов, реализующих определенный интерфейс, в список, содержащий все реализации. Определите список с общим типом, который вы хотите использовать. Вы можете использовать инъекцию конструктора, как показано на картинке, или инъекцию поля.
📲 Мы в MAX
👉@BookJava
Вы можете автосопрягать несколько бинов, реализующих определенный интерфейс, в список, содержащий все реализации. Определите список с общим типом, который вы хотите использовать. Вы можете использовать инъекцию конструктора, как показано на картинке, или инъекцию поля.
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
⁉️ API описано, но команда всё равно понимает его по-разному? Документация устаревает, интеграции ломаются, а согласование занимает больше времени, чем разработка?
👩💻Приглашаем на открытый урок «OpenAPI + Spring»
🗓 15 апреля в 20:00 МСК
🆓 На открытом уроке разберём, как OpenAPI помогает навести порядок: от генерации спецификаций до интеграции в приложения на Spring. Покажем, как сократить количество ошибок, упростить взаимодействие между командами и сделать разработку предсказуемой. Разберём реальные сценарии: где возникают проблемы, как их избежать и какие подходы работают в проектах.
Урок будет полезен разработчикам, архитекторам и всем, кто работает с API.
🔗 Ссылка на регистрацию: https://vk.cc/cWnqAQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👩💻Приглашаем на открытый урок «OpenAPI + Spring»
🗓 15 апреля в 20:00 МСК
🆓 На открытом уроке разберём, как OpenAPI помогает навести порядок: от генерации спецификаций до интеграции в приложения на Spring. Покажем, как сократить количество ошибок, упростить взаимодействие между командами и сделать разработку предсказуемой. Разберём реальные сценарии: где возникают проблемы, как их избежать и какие подходы работают в проектах.
Урок будет полезен разработчикам, архитекторам и всем, кто работает с API.
🔗 Ссылка на регистрацию: https://vk.cc/cWnqAQ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🚀 Разбираемся с
Сегодня разберёмся с
✅ Когда
1️⃣ Сокращение шаблонного кода
2️⃣ Улучшает читаемость при длинных объявлениях
3️⃣ Хорош при использовании анонимных классов
4️⃣ Идеален для итераторов
❌ Когда
1️⃣ Неочевидный тип данных
2️⃣ Снижение читаемости сложного кода
3️⃣ Не подходит для публичных API
Если метод возвращает
🔥 Итог
Используйте
📌26 рекомендаций по использованию типа var в Java
https://habr.com/ru/articles/438206/
https://dzone.com/articles/var-work-in-progress
📲 Мы в MAX
👉@BookJava
var в Java: Когда использовать, а когда нет? Сегодня разберёмся с
var в Java. Этот локальный тип вывода переменной появился в Java 10 и сразу вызвал много споров. Давайте посмотрим, когда его стоит использовать, а когда лучше отказаться. ✅ Когда
var полезен? 1️⃣ Сокращение шаблонного кода
var list = new ArrayList<String>(); // читается проще
2️⃣ Улучшает читаемость при длинных объявлениях
var map = new HashMap<String, List<Integer>>();
3️⃣ Хорош при использовании анонимных классов
var thread = new Thread(() -> System.out.println("Hello"));
4️⃣ Идеален для итераторов
for (var entry : map.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
❌ Когда
var ухудшает код? 1️⃣ Неочевидный тип данных
var data = fetchData(); // Что вернет метод? Интуитивно непонятно!
2️⃣ Снижение читаемости сложного кода
var something = doSomethingComplicated(); // А что это такое?
3️⃣ Не подходит для публичных API
Если метод возвращает
var, мы теряем контракт с пользователем API.🔥 Итог
Используйте
var, когда тип очевиден и код становится чище. Не злоупотребляйте им, чтобы не терять читаемость! 📌26 рекомендаций по использованию типа var в Java
https://habr.com/ru/articles/438206/
https://dzone.com/articles/var-work-in-progress
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👎2
📌 Паттерн "Одиночка" (Singleton) – когда и как правильно использовать?
👋 Сегодня хочу поговорить о Singleton – одном из самых популярных (и часто злоупотребляемых) паттернов в Java.
🔥 Что такое Singleton?
Singleton гарантирует, что у класса будет только один экземпляр и предоставляет глобальную точку доступа к нему.
Пример классического Singleton:
Здесь используется жадная инициализация – объект создаётся сразу при загрузке класса.
💣 Проблемы Singleton
1️⃣ Нарушение SRP (Single Responsibility Principle) – Singleton управляет своим жизненным циклом.
2️⃣ Проблемы с тестированием – сложность мокирования в юнит-тестах.
3️⃣ Глобальное состояние – сложнее поддерживать код, возможны неожиданные баги.
✅ Когда использовать Singleton?
✔ Если требуется единый точный экземпляр (например, пул соединений, логгер).
✔ Если объект дорого создавать и его состояние неизменно.
✔ Когда глобальная точка доступа действительно оправдана.
🔧 Альтернативы
👉 Dependency Injection (DI) – лучше передавать объект через конструктор.
👉 Enum Singleton – лучший способ создать потокобезопасный Singleton:
Он защищён от сериализации и reflection-атак! 🚀
📲 Мы в MAX
👉@BookJava
👋 Сегодня хочу поговорить о Singleton – одном из самых популярных (и часто злоупотребляемых) паттернов в Java.
🔥 Что такое Singleton?
Singleton гарантирует, что у класса будет только один экземпляр и предоставляет глобальную точку доступа к нему.
Пример классического Singleton:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
Здесь используется жадная инициализация – объект создаётся сразу при загрузке класса.
💣 Проблемы Singleton
1️⃣ Нарушение SRP (Single Responsibility Principle) – Singleton управляет своим жизненным циклом.
2️⃣ Проблемы с тестированием – сложность мокирования в юнит-тестах.
3️⃣ Глобальное состояние – сложнее поддерживать код, возможны неожиданные баги.
✅ Когда использовать Singleton?
✔ Если требуется единый точный экземпляр (например, пул соединений, логгер).
✔ Если объект дорого создавать и его состояние неизменно.
✔ Когда глобальная точка доступа действительно оправдана.
🔧 Альтернативы
👉 Dependency Injection (DI) – лучше передавать объект через конструктор.
👉 Enum Singleton – лучший способ создать потокобезопасный Singleton:
public enum SingletonEnum {
INSTANCE;
public void someMethod() {
System.out.println("Работаем!");
}
}
Он защищён от сериализации и reflection-атак! 🚀
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
🚀 5 полезных библиотек для Java-разработчика
🔹 Lombok – убирает бойлерплейт-код. Автоматически генерирует геттеры, сеттеры, конструкторы,
🔹 Guava – коллекции, кэширование, строки, примитивные типы, функциональные утилиты и многое другое. Разработана Google, широко используется в индустрии.
🔹 Apache Commons – набор утилит для работы со строками, коллекциями, потоками, датами. Позволяет сократить код и улучшить его читаемость.
🔹 Jackson – одна из лучших библиотек для работы с JSON. Позволяет сериализовать и десериализовать Java-объекты быстро и без лишнего кода.
🔹 Junit + Mockito – тестирование в Java. JUnit – основной инструмент для написания юнит-тестов, а Mockito помогает мокировать зависимости и тестировать сложные сценарии.
📲 Мы в MAX
👉@BookJava
🔹 Lombok – убирает бойлерплейт-код. Автоматически генерирует геттеры, сеттеры, конструкторы,
toString(), equals(), hashCode(). Больше не нужно писать однотипный код вручную! 🔹 Guava – коллекции, кэширование, строки, примитивные типы, функциональные утилиты и многое другое. Разработана Google, широко используется в индустрии.
🔹 Apache Commons – набор утилит для работы со строками, коллекциями, потоками, датами. Позволяет сократить код и улучшить его читаемость.
🔹 Jackson – одна из лучших библиотек для работы с JSON. Позволяет сериализовать и десериализовать Java-объекты быстро и без лишнего кода.
🔹 Junit + Mockito – тестирование в Java. JUnit – основной инструмент для написания юнит-тестов, а Mockito помогает мокировать зависимости и тестировать сложные сценарии.
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
@Hibernate можно использовать только для отношений, но не для простых (базовых) атрибутов. Чтобы она работала и для полей, необходимо использовать байткод-энхансмент через плагин. В этом случае поля, отмеченные как
lazy, будут загружаться при первом обращении к ним.#Java #JPA
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Работа с временными метками в Java: что нужно знать?
Сегодня разберём важную тему — работу с временными метками в Java. Это может пригодиться при логировании, кэшировании, обработке данных и даже в повседневных задачах.
1. Получение текущей временной метки
В Java с появлением
Значение
2. Преобразование timestamp в дату и время
Допустим, у нас есть временная метка, и нам нужно преобразовать её в локальное время:
Так можно легко получить читабельную дату.
3. Разница между датами
Вычислить разницу между двумя временными метками можно так:
Отличный способ измерять производительность кода!
4. Форматирование и вывод даты
Для вывода даты в удобочитаемом формате используем
Итог
Работа с временными метками в Java теперь проще, чем когда-либо. Используйте
📲 Мы в MAX
👉@BookJava
Сегодня разберём важную тему — работу с временными метками в Java. Это может пригодиться при логировании, кэшировании, обработке данных и даже в повседневных задачах.
1. Получение текущей временной метки
В Java с появлением
java.time всё стало проще. Самый удобный способ получить timestamp:
Instant instant = Instant.now();
long timestamp = instant.toEpochMilli(); // В миллисекундах
Значение
timestamp соответствует количеству миллисекунд, прошедших с 1 января 1970 года (UTC).2. Преобразование timestamp в дату и время
Допустим, у нас есть временная метка, и нам нужно преобразовать её в локальное время:
long timestamp = 1700000000000L; // Пример временной метки
Instant instant = Instant.ofEpochMilli(timestamp);
ZonedDateTime dateTime = instant.atZone(ZoneId.systemDefault());
System.out.println(dateTime);
Так можно легко получить читабельную дату.
3. Разница между датами
Вычислить разницу между двумя временными метками можно так:
Instant start = Instant.now();
Thread.sleep(2000); // Эмуляция задержки
Instant end = Instant.now();
Duration duration = Duration.between(start, end);
System.out.println("Разница в секундах: " + duration.getSeconds());
Отличный способ измерять производительность кода!
4. Форматирование и вывод даты
Для вывода даты в удобочитаемом формате используем
DateTimeFormatter:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
String formatted = dateTime.format(formatter);
System.out.println(formatted);
Итог
Работа с временными метками в Java теперь проще, чем когда-либо. Используйте
Instant, Duration и DateTimeFormatter для удобного управления временем. 👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🚀 Подборка полезных IT каналов в Max
Системное администрирование, DevOps 📌
https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин
1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика
Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика
Программирование React📌
https://max.ru/react_lib React
Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика
Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика
GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных
Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков
Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов
Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼💻👩💻
Шутки программистов 📌
https://max.ru/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free
Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров
Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике
Вакансии 📌
https://max.ru/progjob Вакансии в IT
Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных
Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
Системное администрирование, DevOps 📌
https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин
1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика
Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика
Программирование React📌
https://max.ru/react_lib React
Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика
Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика
GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных
Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков
Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов
Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼💻👩💻
Шутки программистов 📌
https://max.ru/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free
Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров
Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике
Вакансии 📌
https://max.ru/progjob Вакансии в IT
Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных
Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
MAX
Bash Советы - Bash Scripting | Linux Terminal & Shell. Скри…
Укроти командную строку. Пишем эффективные Bash-скрипты для сервера и десктопа. Магия текстовой обработки: Grep, Sed, Awk и регулярные выражения (Regex). Настр…
🖕4👍2💩1🤡1
📌 Паттерны проектирования: Декоратор в Java
Привет, друзья! Сегодня я хочу разобрать с вами один из самых полезных и часто применяемых паттернов проектирования — Декоратор.
🚀 Когда его использовать?
Когда нужно динамически добавлять функциональность объекту без изменения его кода. Это альтернатива наследованию, но более гибкая и мощная.
🔍 Пример из жизни
Представьте, что у нас есть базовый интерфейс Notifier, который отправляет сообщения. По умолчанию он умеет слать только e-mail уведомления. Но нам нужно добавить поддержку SMS и пуш-уведомлений.
Вместо того чтобы создавать кучу подклассов, мы используем Декоратор:
🔥 Выход в консоль:
✅ Преимущества:
✔️ Гибкость: можно комбинировать декораторы в любом порядке
✔️ Принцип открытости/закрытости (OCP) — код легко расширяется
✔️ Разделение обязанностей — каждая часть отвечает за свою функцию
📲 Мы в MAX
👉@BookJava
Привет, друзья! Сегодня я хочу разобрать с вами один из самых полезных и часто применяемых паттернов проектирования — Декоратор.
🚀 Когда его использовать?
Когда нужно динамически добавлять функциональность объекту без изменения его кода. Это альтернатива наследованию, но более гибкая и мощная.
🔍 Пример из жизни
Представьте, что у нас есть базовый интерфейс Notifier, который отправляет сообщения. По умолчанию он умеет слать только e-mail уведомления. Но нам нужно добавить поддержку SMS и пуш-уведомлений.
Вместо того чтобы создавать кучу подклассов, мы используем Декоратор:
// Базовый интерфейс
interface Notifier {
void send(String message);
}
// Основная реализация
class EmailNotifier implements Notifier {
@Override
public void send(String message) {
System.out.println("Отправка email: " + message);
}
}
// Базовый декоратор
class NotifierDecorator implements Notifier {
protected Notifier notifier;
public NotifierDecorator(Notifier notifier) {
this.notifier = notifier;
}
@Override
public void send(String message) {
notifier.send(message);
}
}
// Декоратор для SMS
class SMSNotifier extends NotifierDecorator {
public SMSNotifier(Notifier notifier) {
super(notifier);
}
@Override
public void send(String message) {
super.send(message);
System.out.println("Отправка SMS: " + message);
}
}
// Декоратор для Push-уведомлений
class PushNotifier extends NotifierDecorator {
public PushNotifier(Notifier notifier) {
super(notifier);
}
@Override
public void send(String message) {
super.send(message);
System.out.println("Отправка Push-уведомления: " + message);
}
}
// Использование
public class Main {
public static void main(String[] args) {
Notifier notifier = new EmailNotifier();
notifier = new SMSNotifier(notifier);
notifier = new PushNotifier(notifier);
notifier.send("Важное сообщение!");
}
}
🔥 Выход в консоль:
Отправка email: Важное сообщение!
Отправка SMS: Важное сообщение!
Отправка Push-уведомления: Важное сообщение!
✅ Преимущества:
✔️ Гибкость: можно комбинировать декораторы в любом порядке
✔️ Принцип открытости/закрытости (OCP) — код легко расширяется
✔️ Разделение обязанностей — каждая часть отвечает за свою функцию
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Media is too big
VIEW IN TELEGRAM
Spring Data JDBC. Проблемы известные, проблемы неизвестные
Михаил Поливаха
Spring Data JDBC — относительно новый модуль Spring Data. У него своя концепция, свои фичи, свои баги и проблемы. Часть этих проблем известна аудитории и описана в документации. Однако иногда документация врет или недоговаривает. К тому же есть некоторые неочевидные детали реализации, которые могут смутить пользователей библиотеки. Это касается многих аспектов — от генерации SQL до маппинга сущностей.
Во время доклада мы посмотрели на ряд подобных сюрпризов, обсудим, баг это или фича и что разработчики планируют с этим делать. Также рассмотрели текущее состояние проекта Spring Data JDBC — над чем идет работа, что исправляется, а что пока нет.
источник
📲 Мы в MAX
👉@BookJava
Михаил Поливаха
Spring Data JDBC — относительно новый модуль Spring Data. У него своя концепция, свои фичи, свои баги и проблемы. Часть этих проблем известна аудитории и описана в документации. Однако иногда документация врет или недоговаривает. К тому же есть некоторые неочевидные детали реализации, которые могут смутить пользователей библиотеки. Это касается многих аспектов — от генерации SQL до маппинга сущностей.
Во время доклада мы посмотрели на ряд подобных сюрпризов, обсудим, баг это или фича и что разработчики планируют с этим делать. Также рассмотрели текущее состояние проекта Spring Data JDBC — над чем идет работа, что исправляется, а что пока нет.
источник
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
⚡️ 5 Фишек Lombok, Которые Вы Должны Знать!
Если вы до сих пор пишете геттеры и сеттеры вручную, самое время это прекратить! 😄
Вот 5 крутых аннотаций, которые обязательно нужно знать:
🔹
📌 Результат: автоматическая генерация геттеров, сеттеров и других методов.
🔹
📌 Теперь можно создавать объекты так:
🔹
📌 Отлично подходит для DTO!
🔹
📌 Не нужно вручную объявлять
🔹
📌 Работает так, как будто исключений нет, но лучше использовать осознанно!
👉 Используете Lombok в проектах? Какая аннотация вам больше всего нравится? Делитесь в комментариях! 💬
📲 Мы в MAX
👉@BookJava
Если вы до сих пор пишете геттеры и сеттеры вручную, самое время это прекратить! 😄
Вот 5 крутых аннотаций, которые обязательно нужно знать:
🔹
@Data – Комбо-аннотация, которая сразу добавляет @Getter, @Setter, @ToString, @EqualsAndHashCode и @RequiredArgsConstructor. Если у вас обычный POJO-класс, просто ставите @Data, и всё!
@Data
public class User {
private String name;
private int age;
}
📌 Результат: автоматическая генерация геттеров, сеттеров и других методов.
🔹
@Builder – Шаблон проектирования "Строитель" на стероидах!
@Builder
public class User {
private String name;
private int age;
}
📌 Теперь можно создавать объекты так:
User user = User.builder().name("Иван").age(25).build();
🔹
@Value – Неперезаписываемые (иммутабельные) объекты. Это как @Data, но с final полями и без сеттеров.
@Value
public class User {
String name;
int age;
}
📌 Отлично подходит для DTO!
🔹
@Slf4j – Логирование без бойлерплейта.
@Slf4j
public class App {
public static void main(String[] args) {
log.info("Привет, мир!");
}
}
📌 Не нужно вручную объявлять
Logger — Lombok всё сделает за вас. 🔹
@SneakyThrows – Скрывает checked исключения (но осторожно! 😬).
@SneakyThrows
public void readFile(String path) {
Files.readAllLines(Path.of(path));
}
📌 Работает так, как будто исключений нет, но лучше использовать осознанно!
👉 Используете Lombok в проектах? Какая аннотация вам больше всего нравится? Делитесь в комментариях! 💬
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3🥱2👏1
🚀 Подборка полезных IT каналов в Max
Системное администрирование, DevOps 📌
https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин
1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика
Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика
Программирование React📌
https://max.ru/react_lib React
Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика
Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика
GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных
Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков
Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов
Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼💻👩💻
Шутки программистов 📌
https://max.ru/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free
Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров
Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике
Вакансии 📌
https://max.ru/progjob Вакансии в IT
Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных
Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
Системное администрирование, DevOps 📌
https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин
1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика
Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика
Программирование React📌
https://max.ru/react_lib React
Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика
Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика
GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных
Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков
Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов
Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼💻👩💻
Шутки программистов 📌
https://max.ru/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free
Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров
Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике
Вакансии 📌
https://max.ru/progjob Вакансии в IT
Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных
Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
MAX
Системный Администратор | Sysadmin Windows & Linux Server. …
Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Работа с Linux: Ubuntu, CentOS, Debian. Сетевое …
🤮2👍1🤡1
🚀 Разбираемся с
Привет, друзья! Сегодня хочу поговорить о
❓ Что такое
🔥 Как использовать?
1️⃣ Создание
⚠️ Если передать
2️⃣ Создание пустого
3️⃣ Обёртка для возможного
Если передать
4️⃣ Проверка наличия значения:
Но лучше использовать
5️⃣ Получение значения с
6️⃣ Получение с
7️⃣ Исключение, если значения нет:
8️⃣ Фильтрация:
9️⃣ Трансформация с
🔚 Итог:
📲 Мы в MAX
👉@BookJava
Optional в Java: избегаем NullPointerException!Привет, друзья! Сегодня хочу поговорить о
Optional, который помогает нам избежать NullPointerException и делает код чище. ❓ Что такое
Optional? Optional<T> — это контейнер, который может содержать значение типа T или быть пустым. Это альтернатива null, которая явно указывает, что значение может отсутствовать. 🔥 Как использовать?
1️⃣ Создание
Optional:
Optional<String> optional = Optional.of("Hello, Java!");
⚠️ Если передать
null, будет NullPointerException. 2️⃣ Создание пустого
Optional:
Optional<String> emptyOptional = Optional.empty();
3️⃣ Обёртка для возможного
null:
Optional<String> nullableOptional = Optional.ofNullable(null);
Если передать
null, Optional не упадёт, а просто будет пустым.4️⃣ Проверка наличия значения:
optional.isPresent(); // true
optional.isEmpty(); // false
Но лучше использовать
ifPresent:
optional.ifPresent(value -> System.out.println(value));
5️⃣ Получение значения с
orElse:
String result = optional.orElse("Значение по умолчанию");
6️⃣ Получение с
orElseGet:
String result = optional.orElseGet(() -> "Вычисленное значение");
7️⃣ Исключение, если значения нет:
String result = optional.orElseThrow(() -> new RuntimeException("Значение отсутствует!"));
8️⃣ Фильтрация:
Optional<String> filtered = optional.filter(val -> val.startsWith("Hello"));
9️⃣ Трансформация с
map:
Optional<Integer> length = optional.map(String::length);
🔚 Итог:
Optional — мощный инструмент, но не стоит злоупотреблять им везде. Используйте его в возвращаемых значениях, но не в полях и параметрах методов.👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1
В чем разница между Iterator и ListIterator?
— Iterator может итерироваться только вперед, а ListIterator может и вперед и назад.
— ListIterator имеет дополнительные методы
— ListIterator позволяет получить индекс текущего элемента.
— ListIterator может начать итерацию с произвольного индекса списка, а Iterator только с начала.
— ListIterator можно получить только из объектов, реализующих List, а Iterator из любой коллекции.
— ListIterator является более функциональным и позволяет вносить изменения в список во время итерации, Iterator — только читать.
— Итераторы безопасны для использования в многопоточных приложениях, а ListIterator — нет.
📲 Мы в MAX
👉@BookJava
— Iterator может итерироваться только вперед, а ListIterator может и вперед и назад.
— ListIterator имеет дополнительные методы
previous(), hasPrevious(), add(), set().— ListIterator позволяет получить индекс текущего элемента.
— ListIterator может начать итерацию с произвольного индекса списка, а Iterator только с начала.
— ListIterator можно получить только из объектов, реализующих List, а Iterator из любой коллекции.
— ListIterator является более функциональным и позволяет вносить изменения в список во время итерации, Iterator — только читать.
— Итераторы безопасны для использования в многопоточных приложениях, а ListIterator — нет.
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
📌 Java: Как работает
🔥 Что делает
Ключевое слово
🔄 Разбираем на примере:
🛑 Важные моменты:
✅
✅ Он не предотвращает гонки данных, но гарантирует видимость изменений между потоками.
✅ Лучше всего подходит для флагов завершения потоков и подобных сценариев.
📲 Мы в MAX
👉@BookJava
volatile и когда его использовать?🔥 Что делает
volatile?Ключевое слово
volatile гарантирует, что переменная всегда будет читаться из памяти, а не из кэша потока. Это помогает избежать проблем, когда один поток изменяет переменную, но другой поток продолжает работать со старым значением из кэша.🔄 Разбираем на примере:
class SharedResource {
volatile boolean flag = false;
void changeFlag() {
flag = true;
}
}
class Worker extends Thread {
SharedResource resource;
Worker(SharedResource resource) {
this.resource = resource;
}
public void run() {
while (!resource.flag) {
// Ждём, пока флаг изменится
}
System.out.println("Флаг изменился! Поток завершает работу.");
}
}
public class VolatileExample {
public static void main(String[] args) throws InterruptedException {
SharedResource resource = new SharedResource();
Worker worker = new Worker(resource);
worker.start();
Thread.sleep(1000);
resource.changeFlag(); // Флаг изменится, и поток завершит цикл
worker.join();
}
}
🛑 Важные моменты:
✅
volatile не делает операции атомарными. Если вам нужна атомарность, используйте synchronized или Atomic классы. ✅ Он не предотвращает гонки данных, но гарантирует видимость изменений между потоками.
✅ Лучше всего подходит для флагов завершения потоков и подобных сценариев.
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔥 Разбираем
Всем добрый вечер! Сегодня расскажу про
🤔 Что такое
Это часть
🚀 Базовый пример использования
Допустим, у нас есть задача загрузить данные с сервера. Как это сделать асинхронно?
🔍 Разбираем код
1️⃣
2️⃣
3️⃣ Главный поток продолжает работать, не блокируя выполнение.
🛠 Расширяем функционал
Можно комбинировать задачи:
✅
✅
📌 Где использовать?
🔹 Запросы к API без блокировки
🔹 Асинхронная обработка данных
🔹 Параллельные вычисления
📲 Мы в MAX
👉@BookJava
CompletableFuture в Java: Асинхронность без боли Всем добрый вечер! Сегодня расскажу про
CompletableFuture — мощный инструмент для работы с асинхронными операциями в Java. Если вы хотите избавиться от блокирующего кода и сложных коллбэков, этот пост для вас! 🤔 Что такое
CompletableFuture? Это часть
java.util.concurrent, позволяющая писать асинхронный код в декларативном стиле, без создания сложных цепочек Thread и ExecutorService. 🚀 Базовый пример использования
Допустим, у нас есть задача загрузить данные с сервера. Как это сделать асинхронно?
import java.util.concurrent.CompletableFuture;
public class AsyncExample {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
// Имитация долгого запроса
sleep(2000);
return "Данные загружены";
}).thenAccept(result ->
System.out.println("Результат: " + result)
);
System.out.println("Задача запущена, ждем результат...");
sleep(3000); // Чтобы main не завершился раньше времени
}
private static void sleep(int millis) {
try { Thread.sleep(millis); }
catch (InterruptedException e) { Thread.currentThread().interrupt(); }
}
}
🔍 Разбираем код
1️⃣
supplyAsync() — выполняет операцию в фоновом потоке. 2️⃣
thenAccept() — получает результат и выполняет код после завершения. 3️⃣ Главный поток продолжает работать, не блокируя выполнение.
🛠 Расширяем функционал
Можно комбинировать задачи:
CompletableFuture.supplyAsync(() -> "Привет, ")
.thenApply(greeting -> greeting + "мир!")
.thenAccept(System.out::println);
✅
thenApply() изменяет данные перед следующим шагом. ✅
thenAccept() выполняет финальную операцию. 📌 Где использовать?
🔹 Запросы к API без блокировки
🔹 Асинхронная обработка данных
🔹 Параллельные вычисления
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Stream API: Обзор и Основные Методы
Stream API – мощный инструмент для обработки данных. Его основные принципы:
✅ Композиция – построение логики из небольших, независимых и чистых функций.
✅ Single Responsibility – каждый шаг выполняет одну конкретную операцию.
Такой подход обеспечивает:
✔️ Читаемость кода.
✔️ Отсутствие локальных переменных.
✔️ Линейную последовательность действий.
Основные компоненты Stream API
Любой поток состоит из трех ключевых частей:
1️⃣ Источник данных (коллекция, массив, файл и т. д.).
2️⃣ Промежуточные преобразования (filter, map и другие).
3️⃣ Конечная операция (коллекционирование, агрегация, перебор).
Способы создания стрима
Stream можно создать несколькими способами:
🔹 Из коллекции:
🔹 Из массива:
🔹 Из набора элементов:
🔹 Бесконечный поток:
🔹 Бесконечный поток с ограничением (Java 9):
🔹 Генерация элементов:
🔹 Диапазон значений:
-
-
🔹 Из файла:
🔹 Из строки:
Промежуточные операции
Stream API поддерживает множество преобразований. Наиболее распространенные:
✔️ Фильтрация:
✔️ Удаление дубликатов:
✔️ Ограничение количества:
✔️ Сортировка:
Менее очевидные операции
🔹 map(Function<T, R>) – применяет функцию к каждому элементу.
🔹 flatMap(Function<T, Stream<R>>) – «разворачивает» элементы из вложенных структур.
🔹 takeWhile(Predicate<T>) (Java 9) – берет элементы, пока выполняется условие.
🔹 dropWhile(Predicate<T>) (Java 9) – пропускает элементы, пока условие выполняется.
🔹 peek(Consumer<T>) – выполняет действие без изменения элементов (удобно для логирования).
Конечные операции
Стрим начинает обработку данных только при вызове конечной операции:
📌 Коллекционирование:
-
-
📌 Поиск элементов:
-
-
-
-
-
📌 Агрегация:
-
-
-
-
📌 Побочные эффекты:
-
-
Особенности работы со Stream API
1️⃣ Стрим – это не структура данных
Он лишь обходит источник, выполняя операции лениво.
2️⃣ Стрим нельзя использовать повторно
После вызова конечной операции повторное использование потока приведет к
3️⃣ Исходные данные не изменяются
Методы Stream API не модифицируют исходную коллекцию.
Разбор сложных случаев
❌ Ошибочный код:
✅ Почему ошибка?
Метод
ℹ️ Решение:
📲 Мы в MAX
👉@BookJava
Stream API – мощный инструмент для обработки данных. Его основные принципы:
✅ Композиция – построение логики из небольших, независимых и чистых функций.
✅ Single Responsibility – каждый шаг выполняет одну конкретную операцию.
Такой подход обеспечивает:
✔️ Читаемость кода.
✔️ Отсутствие локальных переменных.
✔️ Линейную последовательность действий.
Основные компоненты Stream API
Любой поток состоит из трех ключевых частей:
1️⃣ Источник данных (коллекция, массив, файл и т. д.).
2️⃣ Промежуточные преобразования (filter, map и другие).
3️⃣ Конечная операция (коллекционирование, агрегация, перебор).
Способы создания стрима
Stream можно создать несколькими способами:
🔹 Из коллекции:
collection.stream() 🔹 Из массива:
Arrays.stream(array) 🔹 Из набора элементов:
Stream.of(1, 2, 3) 🔹 Бесконечный поток:
Stream.iterate(0, n -> n + 1) 🔹 Бесконечный поток с ограничением (Java 9):
Stream.iterate(1, n -> n < 100, n -> n * 2) 🔹 Генерация элементов:
Stream.generate(Math::random) 🔹 Диапазон значений:
-
IntStream.range(1, 5) (1, 2, 3, 4) -
IntStream.rangeClosed(1, 5) (1, 2, 3, 4, 5) 🔹 Из файла:
Files.lines(Path.of("file.txt")) 🔹 Из строки:
"abc".chars() Промежуточные операции
Stream API поддерживает множество преобразований. Наиболее распространенные:
✔️ Фильтрация:
filter(Predicate<T>) – оставляет только элементы, соответствующие условию. ✔️ Удаление дубликатов:
distinct() – исключает повторяющиеся элементы. ✔️ Ограничение количества:
limit(n) – берет первые n элементов. ✔️ Сортировка:
sorted() – упорядочивает элементы. Менее очевидные операции
🔹 map(Function<T, R>) – применяет функцию к каждому элементу.
🔹 flatMap(Function<T, Stream<R>>) – «разворачивает» элементы из вложенных структур.
🔹 takeWhile(Predicate<T>) (Java 9) – берет элементы, пока выполняется условие.
🔹 dropWhile(Predicate<T>) (Java 9) – пропускает элементы, пока условие выполняется.
🔹 peek(Consumer<T>) – выполняет действие без изменения элементов (удобно для логирования).
Конечные операции
Стрим начинает обработку данных только при вызове конечной операции:
📌 Коллекционирование:
-
collect(Collectors.toList()) – собирает в List. -
collect(Collectors.toSet()) – собирает в Set. 📌 Поиск элементов:
-
findFirst() – первый элемент. -
findAny() – любой элемент (оптимизирован для параллельных потоков). -
anyMatch(Predicate<T>) – хотя бы один элемент удовлетворяет условию. -
allMatch(Predicate<T>) – все элементы удовлетворяют условию. -
noneMatch(Predicate<T>) – ни один элемент не удовлетворяет условию. 📌 Агрегация:
-
min(Comparator<T>) – минимальный элемент. -
max(Comparator<T>) – максимальный элемент. -
count() – количество элементов. -
reduce(BinaryOperator<T>) – свертка элементов в одно значение. 📌 Побочные эффекты:
-
forEach(Consumer<T>) – выполняет действие над каждым элементом. -
forEachOrdered(Consumer<T>) – выполняет действие, сохраняя порядок (важно для параллельных потоков). Особенности работы со Stream API
1️⃣ Стрим – это не структура данных
Он лишь обходит источник, выполняя операции лениво.
2️⃣ Стрим нельзя использовать повторно
После вызова конечной операции повторное использование потока приведет к
IllegalStateException. 3️⃣ Исходные данные не изменяются
Методы Stream API не модифицируют исходную коллекцию.
Разбор сложных случаев
❌ Ошибочный код:
Stream.of(-1, 0, 1).max(Math::max).get();
✅ Почему ошибка?
Метод
max() принимает Comparator<T>, но Math.max(a, b) – это BiFunction<Integer, Integer, Integer>. Они не эквивалентны! ℹ️ Решение:
Stream.of(-1, 0, 1).max(Integer::compareTo).get(); // Вернет 1
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🚀 Подборка полезных IT каналов в Max
Системное администрирование, DevOps 📌
https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин
1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика
Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика
Программирование React📌
https://max.ru/react_lib React
Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика
Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика
GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных
Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков
Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов
Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼💻👩💻
Шутки программистов 📌
https://max.ru/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free
Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров
Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике
Вакансии 📌
https://max.ru/progjob Вакансии в IT
Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных
Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
Системное администрирование, DevOps 📌
https://max.ru/i_odmin Все для системного администратора
https://max.ru/bash_srv Bash Советы
https://max.ru/sysadminof Книги для админов, полезные материалы
https://max.ru/i_odmin_book Библиотека Системного Администратора
https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др.
https://max.ru/tipsysdmin Типичный Сисадмин
1C разработка 📌
https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://max.ru/cpp_lib Библиотека C/C++ разработчика
Программирование Go📌
https://max.ru/golang_lib Библиотека Go (Golang) разработчика
Программирование React📌
https://max.ru/react_lib React
Программирование Python 📌
https://max.ru/python_of Python академия.
https://max.ru/BookPython Библиотека Python разработчика
Java разработка 📌
https://max.ru/bookjava Библиотека Java разработчика
GitHub Сообщество 📌
https://max.ru/githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://max.ru/database_info Все про базы данных
Фронтенд разработка 📌
https://max.ru/frontend_1 Подборки для frontend разработчиков
Библиотеки 📌
https://max.ru/programmist_of Книги по программированию
https://max.ru/proglb Библиотека программиста
https://max.ru/bfbook Книги для программистов
Программирование 📌
https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций
https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT
https://max.ru/php_lib Библиотека PHP программиста 👨🏼💻👩💻
Шутки программистов 📌
https://max.ru/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://max.ru/thehaking Канал о кибербезопасности
https://max.ru/xakkep_1 Хакер Free
Книги, статьи для дизайнеров 📌
https://max.ru/odesigners Статьи, книги для дизайнеров
Математика 📌
https://max.ru/Pomatematike Канал по математике
https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике
Вакансии 📌
https://max.ru/progjob Вакансии в IT
Мир технологий 📌
https://max.ru/mir_teh Канал для любознательных
Бонус 📌
https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга
https://max.ru/mockva_life Свежие новости Москвы
MAX
Системный Администратор | Sysadmin Windows & Linux Server. …
Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Работа с Linux: Ubuntu, CentOS, Debian. Сетевое …
🤮2🖕2👍1
📝 Советы по оптимизации Java кода: избавляемся от лишнего
Привет, друзья! Сегодня поговорим об оптимизации кода. Все мы знаем, что код должен быть не только работоспособным, но и читаемым, эффективным и поддерживаемым. Давайте разберем несколько типичных ошибок и способов их устранения.
🚀 1. Избегайте ненужного создания объектов
Частая ошибка — создавать объекты там, где можно использовать уже существующие.
❌ Плохо:
✅ Хорошо:
То же самое касается
🔄 2. Используйте StringBuilder вместо конкатенации в цикле
Если вы объединяете строки в цикле,
❌ Плохо:
✅ Хорошо:
Такой код работает в разы быстрее!
🏎 3. Правильно выбирайте коллекции
Используйте
Используйте
Используйте
⚡ 4. Не злоупотребляйте Stream API
Да, Stream API удобен, но иногда он замедляет код. Например:
❌ Плохо:
✅ Хорошо:
Цикл быстрее, потому что не тратит время на создание объектов и лямбды.
🔥 Вывод
Оптимизация — это не просто ускорение кода, но и улучшение его читаемости и поддержки. Используйте правильные структуры данных, избегайте лишних аллокаций, выбирайте оптимальные конструкции.
А какие советы по оптимизации Java кода используете вы? Пишите в комментариях! 👇 🚀
📲 Мы в MAX
👉@BookJava
Привет, друзья! Сегодня поговорим об оптимизации кода. Все мы знаем, что код должен быть не только работоспособным, но и читаемым, эффективным и поддерживаемым. Давайте разберем несколько типичных ошибок и способов их устранения.
🚀 1. Избегайте ненужного создания объектов
Частая ошибка — создавать объекты там, где можно использовать уже существующие.
❌ Плохо:
String str = new String("Hello"); // Избыточно
✅ Хорошо:
String str = "Hello"; // Используем строковый пул
То же самое касается
Integer.valueOf() вместо new Integer(). 🔄 2. Используйте StringBuilder вместо конкатенации в цикле
Если вы объединяете строки в цикле,
StringBuilder будет значительно быстрее. ❌ Плохо:
String result = "";
for (int i = 0; i < 100; i++) {
result += i; // Создает новый объект String на каждой итерации
}
✅ Хорошо:
StringBuilder result = new StringBuilder();
for (int i = 0; i < 100; i++) {
result.append(i);
}
Такой код работает в разы быстрее!
🏎 3. Правильно выбирайте коллекции
Используйте
ArrayList, если не нужна частая вставка/удаление элементов в середине списка. Используйте
HashSet, если важны уникальные значения и не нужен порядок. Используйте
LinkedList, если нужна частая вставка/удаление в середине списка. ⚡ 4. Не злоупотребляйте Stream API
Да, Stream API удобен, но иногда он замедляет код. Например:
❌ Плохо:
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, Integer::sum);
✅ Хорошо:
int sum = 0;
for (int num : numbers) {
sum += num;
}
Цикл быстрее, потому что не тратит время на создание объектов и лямбды.
🔥 Вывод
Оптимизация — это не просто ускорение кода, но и улучшение его читаемости и поддержки. Используйте правильные структуры данных, избегайте лишних аллокаций, выбирайте оптимальные конструкции.
А какие советы по оптимизации Java кода используете вы? Пишите в комментариях! 👇 🚀
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🔥1
📝 Разбираем
Давайте обсудимм одну из самых популярных аннотаций в Spring —
🔍 Как работает
Когда вы помечаете метод
Но тут важно помнить:
🔹
🔹 Вызовы методов внутри одного класса не учитывают
🔹 По умолчанию, транзакция откатывается только при RuntimeException. Если бросить
⚠️ Распространённые ошибки
❌ Аннотация на private методе
Транзакция просто не будет работать, так как Spring AOP не перехватит вызов.
❌ Вызов
Транзакция не создастся, так как вызов происходит без участия Spring Proxy. Решение — выносить такие методы в отдельный бин или использовать
❌ Неправильный rollback
Если в методе выбрасывается
✅ Как избежать проблем?
✔️ Всегда ставьте
✔️ Вызывайте
✔️ Контролируйте rollback через
✔️ Используйте
Кто сталкивался с неожиданным поведением
📲 Мы в MAX
👉@BookJava
@Transactional в Spring: Где Подводные Камни? Давайте обсудимм одну из самых популярных аннотаций в Spring —
@Transactional. Многие знают, что она используется для управления транзакциями, но не все понимают, как она работает под капотом и какие проблемы могут возникнуть. Давайте разбираться! 🔍 Как работает
@Transactional? Когда вы помечаете метод
@Transactional, Spring проксирует этот метод и оборачивает его в транзакцию. Это значит, что до начала метода открывается транзакция, а после — либо коммитится (если нет ошибок), либо откатывается (если есть исключение). Но тут важно помнить:
🔹
@Transactional работает только на public методах (если используется Spring AOP). 🔹 Вызовы методов внутри одного класса не учитывают
@Transactional. Если вызвать метод, аннотированный @Transactional, внутри другого метода того же класса, транзакция не создастся. 🔹 По умолчанию, транзакция откатывается только при RuntimeException. Если бросить
checked-исключение, Spring не откатит транзакцию. ⚠️ Распространённые ошибки
❌ Аннотация на private методе
Транзакция просто не будет работать, так как Spring AOP не перехватит вызов.
❌ Вызов
@Transactional метода внутри того же класса Транзакция не создастся, так как вызов происходит без участия Spring Proxy. Решение — выносить такие методы в отдельный бин или использовать
TransactionTemplate. ❌ Неправильный rollback
Если в методе выбрасывается
checked-исключение, Spring по умолчанию **не откатывает** транзакцию. Чтобы изменить это поведение, нужно явно указать `@Transactional(rollbackFor = Exception.class). ✅ Как избежать проблем?
✔️ Всегда ставьте
@Transactional на публичные методы. ✔️ Вызывайте
@Transactional-методы только через Spring-управляемые бины. ✔️ Контролируйте rollback через
rollbackFor. ✔️ Используйте
propagation = REQUIRES_NEW, если хотите создать новую независимую транзакцию. Кто сталкивался с неожиданным поведением
@Transactional? Давайте обсудим в комментариях! 👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4