🦾 Тест по Java 🦾
📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «Java Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!
👩💻 В программе курса — все актуальные инструменты, необходимые Middle+ разработчику на Java. Возможна рассрочка.
⏰ Время прохождения теста ограничено 30 минут
👉ПРОЙТИ ТЕСТ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «Java Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!
⏰ Время прохождения теста ограничено 30 минут
👉ПРОЙТИ ТЕСТ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Collection vs List в Java: в чём разница и когда что использовать
Сегодня разберёмся с одним из самых популярных вопросов у джавистов: чем отличается
🔹 Collection — это базовый интерфейс всех коллекций в Java. Он описывает общие операции:
🔹 List — это подинтерфейс
Дополнительно даёт методы:
🔧 Пример с Collection:
Здесь важно только наличие элементов — порядок и индексы не важны.
🔧 Пример с List:
В этом случае нужен порядок и доступ по индексу — значит, выбираем
📌 Когда использовать что:
- Используй
- Используй
- важен порядок добавления,
- нужен доступ по индексу,
- требуется вставка в определённое место.
🧠 Совет:
При проектировании методов или API лучше принимать
А если внутри метода тебе нужны индексы — переходи на
👉@BookJava
Сегодня разберёмся с одним из самых популярных вопросов у джавистов: чем отличается
Collection
от List
и когда что применять.🔹 Collection — это базовый интерфейс всех коллекций в Java. Он описывает общие операции:
add()
, remove()
, size()
, contains()
и т.д.🔹 List — это подинтерфейс
Collection
, предназначенный для работы с упорядоченными списками. Дополнительно даёт методы:
get(index)
, set(index, value)
, indexOf()
, add(index, value)
.🔧 Пример с Collection:
Collection<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
for (String name : names) {
System.out.println(name);
}
Здесь важно только наличие элементов — порядок и индексы не важны.
🔧 Пример с List:
List<String> cities = new ArrayList<>();
cities.add("Moscow");
cities.add("Berlin");
cities.add(1, "Paris");
System.out.println(cities.get(1)); // Paris
В этом случае нужен порядок и доступ по индексу — значит, выбираем
List
.📌 Когда использовать что:
- Используй
Collection
, если хочешь абстрагироваться от конкретной структуры и не используешь индексы.- Используй
List
, если:- важен порядок добавления,
- нужен доступ по индексу,
- требуется вставка в определённое место.
🧠 Совет:
При проектировании методов или API лучше принимать
Collection
— так ты не ограничиваешь пользователя в реализации. А если внутри метода тебе нужны индексы — переходи на
List
.👉@BookJava
👍3
Подборка Telegram каналов для программистов
https://t.me/bash_srv Bash Советы
https://t.me/win_sysadmin Системный Администратор Windows
https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus Вакансии для программистов 1С
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/DevLab1C 1С:Предприятие 8
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/bash_srv Bash Советы
https://t.me/win_sysadmin Системный Администратор Windows
https://t.me/lifeproger Жизнь программиста. Авторский канал.
https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://t.me/rabota1C_rus Вакансии для программистов 1С
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/linux_odmin Linux: Системный администратор
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/DevLab1C 1С:Предприятие 8
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Telegram
Bash Советы
🚀 Секреты и советы по Bash
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
По всем вопросам @evgenycarter
🔹 Полезные трюки, хитрые однострочники и лайфхаки для работы в терминале.
🔹 Автоматизация, скрипты и оптимизация работы в Linux.
🔹 Стать мастером Bash легко – просто подпишись!
По всем вопросам @evgenycarter
@TransactionalEventListener
— это специализированная версия @EventListener
, которая прослушивает событие и ждёт завершения текущей транзакции, прежде чем сработать. Ожидание согласованного состояния базы данных позволяет безопаснее реагировать на изменения, внесённые в БД ✨
#Java #springboot
👉@BookJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4
Сегодня я покажу вам простой, но мощный приём, который помогает упростить работу с коллекциями в Java —
Если вы когда-нибудь писали что-то вроде:
то
Где это может пригодиться?
– Возвращаете коллекцию из метода и не хотите, чтобы кто-то её изменял
– Хотите обернуть результат в
– Нужно после сбора в Stream ещё что-то сделать над результатом (например, отсортировать, фильтровать, обернуть)
Ещё пример:
Этот метод часто остаётся в тени, но он может существенно упростить код и сделать его чище. Попробуйте использовать его в своём проекте 😉
👉@BookJava
Collectors.collectingAndThen
.Если вы когда-нибудь писали что-то вроде:
List<String> list = someStream
.collect(Collectors.toList());
return Collections.unmodifiableList(list);
то
collectingAndThen
сделает это в одну строку:
List<String> list = someStream.collect(
Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList
)
);
Где это может пригодиться?
– Возвращаете коллекцию из метода и не хотите, чтобы кто-то её изменял
– Хотите обернуть результат в
Optional
, Set
, Map
, EnumMap
и т.д. – Нужно после сбора в Stream ещё что-то сделать над результатом (например, отсортировать, фильтровать, обернуть)
Ещё пример:
Optional<String> maxName = people.stream()
.map(Person::getName)
.collect(Collectors.collectingAndThen(
Collectors.maxBy(Comparator.naturalOrder()),
Optional::ofNullable
));
Этот метод часто остаётся в тени, но он может существенно упростить код и сделать его чище. Попробуйте использовать его в своём проекте 😉
👉@BookJava
👍15
👩💻 Сообщения, которые не теряются: Брокеры против хаоса в Java
Приглашаем на открытый урок.
🗓 08 апреля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».
Узнайте, как обеспечить 100% доставку данных в распределенных Java-системах: боремся с потерями, хаосом и scaling-вызовами.
О чём поговорим:
✔️ Брокеры vs хаос: Как Kafka, RabbitMQ и ActiveMQ спасают данные от потерь.
✔️ Асинхронный Java на практике: Пишем код с гарантированной доставкой сообщений.
✔️ Антипаттерны: Топ-5 ошибок, которые приводят к краху системы (и как их избежать).
Кому будет интересно:
Вебинар будет полезен разработчикам, архитекторам и специалистам по интеграции, работающим с распределенными системами и стремящимся обеспечить надежную доставку данных.
В результате урока:
Участники научатся выбирать брокеры под задачи, реализовывать паттерны вроде Publisher-Subscriber , а также получат шаблоны кода для интеграции в свои проекты.
🔗 Ссылка на регистрацию: https://vk.cc/cKqBkW
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Приглашаем на открытый урок.
🗓 08 апреля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».
Узнайте, как обеспечить 100% доставку данных в распределенных Java-системах: боремся с потерями, хаосом и scaling-вызовами.
О чём поговорим:
Кому будет интересно:
Вебинар будет полезен разработчикам, архитекторам и специалистам по интеграции, работающим с распределенными системами и стремящимся обеспечить надежную доставку данных.
В результате урока:
Участники научатся выбирать брокеры под задачи, реализовывать паттерны вроде Publisher-Subscriber , а также получат шаблоны кода для интеграции в свои проекты.
🔗 Ссылка на регистрацию: https://vk.cc/cKqBkW
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🧪 Зачем Java-разработчику тестировать логику в SQL?
Привет! Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение.
Если у тебя в проекте сложная логика в
🔹 Создаём функцию в PostgreSQL:
🔹 Проверяем прямо в базе:
✅ Это удобно, когда:
- Ты хочешь протестировать ветки логики без запуска всего приложения;
- У тебя CI/CD запускает SQL-тесты отдельно (через
- Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста.
💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение.
Попробуй — экономит массу времени на ревью и отладке запросов!
👉@BookJava
Привет! Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение.
Если у тебя в проекте сложная логика в
JOIN
, CASE
, оконных функциях или CTE
— протестируй это на стороне базы, как обычную функцию.🔹 Создаём функцию в PostgreSQL:
CREATE OR REPLACE FUNCTION test_discount(user_id INT)
RETURNS NUMERIC AS $$
BEGIN
RETURN (
SELECT
CASE
WHEN u.vip = true THEN 0.2
ELSE 0.05
END
FROM users u WHERE u.id = user_id
);
END;
$$ LANGUAGE plpgsql;
🔹 Проверяем прямо в базе:
SELECT test_discount(101); -- вернёт 0.2 или 0.05
✅ Это удобно, когда:
- Ты хочешь протестировать ветки логики без запуска всего приложения;
- У тебя CI/CD запускает SQL-тесты отдельно (через
pgTAP
, например);- Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста.
💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение.
Попробуй — экономит массу времени на ревью и отладке запросов!
👉@BookJava
👍7❤2🔥2
👨💻 Как уменьшить количество boilerplate-кода с помощью Lombok
Сегодня хочу показать вам один из любимых инструментов — Project Lombok. Он позволяет избавиться от тонны шаблонного кода, который мы ежедневно пишем в Java.
🔹 Вместо десятков строк с геттерами, сеттерами, equals/hashCode и конструкторами, ты просто добавляешь аннотации:
И всё! Lombok сам сгенерирует:
- геттеры/сеттеры
- конструкторы
-
🔹 Часто забываешь про
🧨 Важно: IDE не всегда сразу видит Lombok-код. Убедись, что у тебя установлен Lombok plugin в IntelliJ IDEA или Eclipse.
👉@BookJava
Сегодня хочу показать вам один из любимых инструментов — Project Lombok. Он позволяет избавиться от тонны шаблонного кода, который мы ежедневно пишем в Java.
🔹 Вместо десятков строк с геттерами, сеттерами, equals/hashCode и конструкторами, ты просто добавляешь аннотации:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
}
И всё! Lombok сам сгенерирует:
- геттеры/сеттеры
- конструкторы
-
toString()
, equals()
и hashCode()
🔹 Часто забываешь про
@Builder
? Он тоже есть! И позволяет удобно создавать объекты:
User user = User.builder()
.name("Женя")
.age(30)
.build();
🧨 Важно: IDE не всегда сразу видит Lombok-код. Убедись, что у тебя установлен Lombok plugin в IntelliJ IDEA или Eclipse.
👉@BookJava
👍5👎2
🧹 Как не захламлять логи в Java
Сегодня покажу вам простой, но важный приём: логируйте по уровню, а не по привычке.
Многие делают так:
Кажется безобидным? А теперь представьте, что в
Вот что делать вместо:
А ещё лучше — логируйте только то, что действительно нужно:
Так вы:
- Уменьшите размер логов
- Сохраните ценную информацию
- Упростите разбор инцидентов в проде
📌 Советы:
-
-
-
А ты проверял свои логи в проде? Не пора ли провести ревизию?
👉@BookJava
Сегодня покажу вам простой, но важный приём: логируйте по уровню, а не по привычке.
Многие делают так:
log.info("User found: " + user);
Кажется безобидным? А теперь представьте, что в
user
лежит целый граф сущностей с ленивыми загрузками, или список из тысячи записей. Вы просто убьёте читаемость логов и производительность.Вот что делать вместо:
if (log.isDebugEnabled()) {
log.debug("User found: {}", user);
}
А ещё лучше — логируйте только то, что действительно нужно:
log.debug("User found: id={}, email={}", user.getId(), user.getEmail());
Так вы:
- Уменьшите размер логов
- Сохраните ценную информацию
- Упростите разбор инцидентов в проде
📌 Советы:
-
INFO
— для бизнес-событий (например, “заказ оформлен”)-
DEBUG
— для отладки-
WARN
и ERROR
— для проблем, которые требуют вниманияА ты проверял свои логи в проде? Не пора ли провести ревизию?
👉@BookJava
👍9
💻Хотите быстро научиться строить интерактивные интерфейсы на C#?
Присоединяйтесь к открытому уроку 8 апреля в 20:00 мск, где мы покажем, как сделать ваш код живым и динамичным!
📖Вы научитесь использовать класс System.Console для создания простых, но интересных программ с текстовыми интерфейсами. Например, вы напишете свою версию игры "Крестики-нолики" прямо в консоли. Это легко и увлекательно!
🔥С этим знанием вы сможете не просто выводить данные, а создавать интерактивные приложения, которые смогут реагировать на действия пользователя.
➡️ Зарегистрируйтесь на вебинар и получите скидку по промокоду SHARP_SPEC_4 на большое обучение «C# Developer»: https://vk.cc/cKzfGN
Промокод действителен до 30.04.2025
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Присоединяйтесь к открытому уроку 8 апреля в 20:00 мск, где мы покажем, как сделать ваш код живым и динамичным!
📖Вы научитесь использовать класс System.Console для создания простых, но интересных программ с текстовыми интерфейсами. Например, вы напишете свою версию игры "Крестики-нолики" прямо в консоли. Это легко и увлекательно!
🔥С этим знанием вы сможете не просто выводить данные, а создавать интерактивные приложения, которые смогут реагировать на действия пользователя.
➡️ Зарегистрируйтесь на вебинар и получите скидку по промокоду SHARP_SPEC_4 на большое обучение «C# Developer»: https://vk.cc/cKzfGN
Промокод действителен до 30.04.2025
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🧩 Nullable поля в Entity: угроза вашему приложению
Привет, друзья! Сегодня хочу поделиться одной ошибкой, которую часто встречаю в проектах — использование
Когда мы пишем:
JPA считает, что поле nullable, даже если по бизнес-логике оно быть пустым не должно. А вот что будет, если вы забыли это уточнить:
1. На уровне БД поле будет
2. Hibernate не подскажет, что вы забыли заполнить поле.
3. В будущем это приведёт к NPE, особенно при маппинге DTO → Entity.
4. При миграциях Flyway/ Liquibase — возможно несоответствие схемы и модели.
🔍 Что делать?
1. Явно указывать
2. Использовать Bean Validation (
3. Проверяйте соответствие схемы и сущностей. Можно использовать плагин Hibernate5DDL или включать валидацию схемы при старте.
📌 Простой совет: по умолчанию всё
Берегите свои сущности 😉
👉@BookJava
Привет, друзья! Сегодня хочу поделиться одной ошибкой, которую часто встречаю в проектах — использование
nullable = true
в JPA-сущностях по умолчанию, без осознанного выбора.Когда мы пишем:
@Column(name = "middle_name")
private String middleName;
JPA считает, что поле nullable, даже если по бизнес-логике оно быть пустым не должно. А вот что будет, если вы забыли это уточнить:
1. На уровне БД поле будет
NULLABLE
.2. Hibernate не подскажет, что вы забыли заполнить поле.
3. В будущем это приведёт к NPE, особенно при маппинге DTO → Entity.
4. При миграциях Flyway/ Liquibase — возможно несоответствие схемы и модели.
🔍 Что делать?
1. Явно указывать
nullable = false
, если поле обязано быть заполнено:
@Column(name = "email", nullable = false)
private String email;
2. Использовать Bean Validation (
@NotNull
) — и не забывать включить её в контроллерах, сервисах, Hibernate.3. Проверяйте соответствие схемы и сущностей. Можно использовать плагин Hibernate5DDL или включать валидацию схемы при старте.
📌 Простой совет: по умолчанию всё
@Column(nullable = false)
, пока не докажете обратное.Берегите свои сущности 😉
👉@BookJava
👍6
Понимание разницы между Error и Exception в Java ✅
Что такое Error в Java?
- Error (ошибка) в Java представляет собой серьёзные проблемы, которые программа не должна пытаться обрабатывать. Такие ошибки, как правило, генерируются виртуальной машиной Java (JVM) и указывают на сбои, не зависящие от кода программы — например, утечки памяти или переполнение стека.
Что такое Exception в Java?
- Exception (исключение) — это ситуации, которые программа может предсказать и обработать. Это ошибки, от которых можно восстановиться во время выполнения с помощью механизмов обработки исключений, таких как конструкции
👉@BookJava
Что такое Error в Java?
- Error (ошибка) в Java представляет собой серьёзные проблемы, которые программа не должна пытаться обрабатывать. Такие ошибки, как правило, генерируются виртуальной машиной Java (JVM) и указывают на сбои, не зависящие от кода программы — например, утечки памяти или переполнение стека.
Что такое Exception в Java?
- Exception (исключение) — это ситуации, которые программа может предсказать и обработать. Это ошибки, от которых можно восстановиться во время выполнения с помощью механизмов обработки исключений, таких как конструкции
try-catch
.👉@BookJava
👍8🤓2
❓ Java-разработчики, уже пробовали работать с асинхронным кодом через Scala Future?
⏰ 15 апреля в 18:30 на открытом вебинаре Валентин Шилин расскажет, как эффективно использовать Future в Scala: избегать ошибок (блокировки, потеря контекста), комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions) и улучшать производительность кода.
Валентин — старший программист и аналитик данных Deutsche Telekom IT GmbH, эксперт в обработке больших данных и преподаватель курсов по Scala и Apache Spark.
Если вы используете Java и хотите перейти на Scala, или уже работаете с Play Framework, Akka или Spark, — вебинар точно для вас. Научитесь грамотно писать асинхронный код, избегая типичных проблем.
🎁 Все участники смогут задать вопросы эксперту и получат скидку на полный курс по Scala-разработке.
👉 Регистрируйтесь и повысьте эффективность своей работы
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
⏰ 15 апреля в 18:30 на открытом вебинаре Валентин Шилин расскажет, как эффективно использовать Future в Scala: избегать ошибок (блокировки, потеря контекста), комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions) и улучшать производительность кода.
Валентин — старший программист и аналитик данных Deutsche Telekom IT GmbH, эксперт в обработке больших данных и преподаватель курсов по Scala и Apache Spark.
Если вы используете Java и хотите перейти на Scala, или уже работаете с Play Framework, Akka или Spark, — вебинар точно для вас. Научитесь грамотно писать асинхронный код, избегая типичных проблем.
🎁 Все участники смогут задать вопросы эксперту и получат скидку на полный курс по Scala-разработке.
👉 Регистрируйтесь и повысьте эффективность своей работы
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👎1
🎯 Как Java находит классы? Под капотом ClassLoader'ов
Сечас покажу вам одну из самых недооценённых тем в мире Java — механизм загрузки классов.
Когда ты запускаешь Java-приложение, оно не просто «видит» все классы. За кулисами работает цепочка загрузчиков:
1. Bootstrap ClassLoader
Самый базовый. Загружает классы из JDK (
2. Platform ClassLoader (ранее Extension)
Загружает модули платформы (
3. Application ClassLoader
Твой лучший друг. Он отвечает за загрузку классов из
Но вот где начинается магия — ты можешь создать собственный ClassLoader и загружать классы в рантайме из файлов, БД или даже сети. Например:
💡 Это используется в плагинных системах (например, IntelliJ, Jenkins, Minecraft).
Но будь осторожен — неправильная работа с загрузчиками может привести к
👉@BookJava
Сечас покажу вам одну из самых недооценённых тем в мире Java — механизм загрузки классов.
Когда ты запускаешь Java-приложение, оно не просто «видит» все классы. За кулисами работает цепочка загрузчиков:
1. Bootstrap ClassLoader
Самый базовый. Загружает классы из JDK (
rt.jar
, java.base
, и так далее). На него даже нельзя получить ссылку в коде.2. Platform ClassLoader (ранее Extension)
Загружает модули платформы (
jmods
), доступные из JDK, но не из java.base
.3. Application ClassLoader
Твой лучший друг. Он отвечает за загрузку классов из
classpath
(например, target/classes
и lib/*.jar
).Но вот где начинается магия — ты можешь создать собственный ClassLoader и загружать классы в рантайме из файлов, БД или даже сети. Например:
ClassLoader customLoader = new URLClassLoader(new URL[]{new File("plugins/").toURI().toURL()});
Class<?> pluginClass = customLoader.loadClass("com.example.PluginImpl");
💡 Это используется в плагинных системах (например, IntelliJ, Jenkins, Minecraft).
Но будь осторожен — неправильная работа с загрузчиками может привести к
ClassCastException
, даже если классы выглядят одинаково.👉@BookJava
👍10
🔍 Как дебажить ClassLoader-проблемы в Java
В прошлом посте я рассказывал, как работает механизм загрузки классов в JVM. Сегодня разберём, как дебажить проблемы, которые возникают из-за загрузчиков. А это, между прочим, один из самых частых источников боли в больших проектах.
🧨 Типичная проблема:
Текст ошибки одинаковый класс... но JVM считает их разными. Почему?
👉 У каждого
1. Полное имя (
2. Загрузчик (
Если один и тот же класс загружен разными загрузчиками, JVM считает, что это разные классы. Отсюда и ошибки.
🛠 Как дебажить:
1. Вывести загрузчик:
2. Сравнить загрузчики:
Убедись, что два экземпляра класса загружены одним и тем же
3. JVM-флаги:
Добавь при запуске:
Это покажет, откуда и каким загрузчиком загружался каждый класс.
4. Используй инструменты:
-
-
- плагин для IntelliJ: "Classloader Leak Prevention"
📌 А что такое child-first загрузчики?
По умолчанию Java использует parent-first стратегию: сначала спрашивает родителя, и только потом загружает сама. Но иногда нужно наоборот — особенно в системах с плагинами, чтобы изолировать версии зависимостей.
👉@BookJava
В прошлом посте я рассказывал, как работает механизм загрузки классов в JVM. Сегодня разберём, как дебажить проблемы, которые возникают из-за загрузчиков. А это, между прочим, один из самых частых источников боли в больших проектах.
🧨 Типичная проблема:
ClassCastException: class com.example.MyClass cannot be cast to class com.example.MyClass
Текст ошибки одинаковый класс... но JVM считает их разными. Почему?
👉 У каждого
Class
в JVM есть два признака уникальности:1. Полное имя (
com.example.MyClass
)2. Загрузчик (
ClassLoader
)Если один и тот же класс загружен разными загрузчиками, JVM считает, что это разные классы. Отсюда и ошибки.
🛠 Как дебажить:
1. Вывести загрузчик:
System.out.println(myObject.getClass().getClassLoader());
2. Сравнить загрузчики:
Убедись, что два экземпляра класса загружены одним и тем же
ClassLoader
.3. JVM-флаги:
Добавь при запуске:
-verbose:class
Это покажет, откуда и каким загрузчиком загружался каждый класс.
4. Используй инструменты:
-
jvisualvm
(вкладка "Class Loader")-
jconsole
- плагин для IntelliJ: "Classloader Leak Prevention"
📌 А что такое child-first загрузчики?
По умолчанию Java использует parent-first стратегию: сначала спрашивает родителя, и только потом загружает сама. Но иногда нужно наоборот — особенно в системах с плагинами, чтобы изолировать версии зависимостей.
👉@BookJava
👍4❤3
🦾 Тест по Java 🦾
📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «Java Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!
👩💻 В программе курса — все актуальные инструменты, необходимые Middle+ разработчику на Java. Возможна рассрочка.
🎁 Начните обучение со скидкой, подробности у менеджеров. ПРОМОКОД: JAVA_04
⏰ Время прохождения теста ограничено 30 минут
👉ПРОЙТИ ТЕСТ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «Java Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!
⏰ Время прохождения теста ограничено 30 минут
👉ПРОЙТИ ТЕСТ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 Как Java хранит boolean в памяти?
Сегодня я покажу вам, почему
В Java нет отдельного типа, который занимает всего 1 бит. Хотя логично было бы ожидать, что
Пример:
Ты думаешь — три бита. Но JVM выравнивает поля, и из-за этого объект может занимать 16 байт или больше, в зависимости от архитектуры. Почему так?
📌 Причина:
JVM упрощает модель памяти ради производительности — доступ к байтам быстрее, чем к битам. Нет битовых сдвигов, масок и лишней логики.
💡 Что делать, если хочется сэкономить память?
Используй
Это уже реальная битовая структура. Отличный выбор, если у тебя десятки или сотни логических флагов.
А ты знал об этом нюансе хранения boolean? Пиши в комментариях, сталкивался ли с перерасходом памяти из-за простых типов.
👉@BookJava
Сегодня я покажу вам, почему
boolean
в Java — это не просто true или false. А за этим простым типом скрывается интересный нюанс, особенно если ты задумываешься об экономии памяти.В Java нет отдельного типа, который занимает всего 1 бит. Хотя логично было бы ожидать, что
boolean
— это один бит (true/false), на самом деле в памяти он занимает 1 байт (а иногда и больше, в зависимости от структуры объекта).Пример:
public class Flags {
boolean flag1;
boolean flag2;
boolean flag3;
}
Ты думаешь — три бита. Но JVM выравнивает поля, и из-за этого объект может занимать 16 байт или больше, в зависимости от архитектуры. Почему так?
📌 Причина:
JVM упрощает модель памяти ради производительности — доступ к байтам быстрее, чем к битам. Нет битовых сдвигов, масок и лишней логики.
💡 Что делать, если хочется сэкономить память?
Используй
BitSet
:
BitSet flags = new BitSet(3);
flags.set(0, true);
Это уже реальная битовая структура. Отличный выбор, если у тебя десятки или сотни логических флагов.
А ты знал об этом нюансе хранения boolean? Пиши в комментариях, сталкивался ли с перерасходом памяти из-за простых типов.
👉@BookJava
👍15
🚀 Подпишись и прокачай свои скилы: лучшие каналы для IT-специалистов 👨💻📲
Папка с каналами для DevOps, Linux - Windows СисАдминов👍
Папка с каналами для 1С программистов🧑💻
Папка с каналами для C++ программистов👩💻
Папка с каналами для Python программистов👩💻
Папка с каналами для Java программистов🖥
Папка с книгами для программистов 📚
Папка для программистов (frontend, backend, iOS, Android)💻
GitHub Сообщество🧑💻
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base)🖥
https://t.me/database_info Все про базы данных
Разработка игр📱
https://t.me/game_devv Все о разработке игр
БигДата, машинное обучение🖥
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
QA, тестирование🖥
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность💻
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free
Книги, статьи для дизайнеров🎨
https://t.me/ux_web Статьи, книги для дизайнеров
Математика🧮
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак🙃
https://t.me/Excel_lifehack
Технологии🖥
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии💰
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/rabota1C_rus Вакансии для программистов 1С
Папка с каналами для DevOps, Linux - Windows СисАдминов
Папка с каналами для 1С программистов
Папка с каналами для C++ программистов
Папка с каналами для Python программистов
Папка с каналами для Java программистов
Папка с книгами для программистов 📚
Папка для программистов (frontend, backend, iOS, Android)
GitHub Сообщество
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base)
https://t.me/database_info Все про базы данных
Разработка игр
https://t.me/game_devv Все о разработке игр
БигДата, машинное обучение
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
QA, тестирование
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_2 Хакер Free
Книги, статьи для дизайнеров
https://t.me/ux_web Статьи, книги для дизайнеров
Математика
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак
https://t.me/Excel_lifehack
Технологии
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/rabota1C_rus Вакансии для программистов 1С
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Админ Devops
You’ve been invited to add the folder “Админ Devops”, which includes 18 chats.
🔍 Почему
Привет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании
Многие разработчики, особенно начинающие, начинают использовать
📌 Ключевая идея
А не заменять все поля и параметры на
Примеры плохой практики:
Почему это плохо:
- Увеличивается сложность сериализации (особенно с Jackson, GSON).
- Не соответствует архитектурной задумке:
- Проблемы с JPA (Hibernate не дружит с Optional-полями).
- Понижается читаемость кода.
💡 Лучше использовать
То есть
Если кратко:
- ✅ Используй
- ❌ Не используй
А ты как используешь
👉@BookJava
Optional
— это не замена null
везде и всегдаПривет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании
Optional
в Java.Многие разработчики, особенно начинающие, начинают использовать
Optional
везде, где может быть null
, думая, что это автоматически делает код "безопасным". Но так ли это?📌 Ключевая идея
Optional
— сигнализировать о возможном отсутствии значения в результате вызова метода. А не заменять все поля и параметры на
Optional
.Примеры плохой практики:
public class User {
private Optional<String> name; // ❌ Не нужно так делать
}
Почему это плохо:
- Увеличивается сложность сериализации (особенно с Jackson, GSON).
- Не соответствует архитектурной задумке:
Optional
— это не контейнер для полей.- Проблемы с JPA (Hibernate не дружит с Optional-полями).
- Понижается читаемость кода.
💡 Лучше использовать
Optional
вот так:
public Optional<User> findUserById(Long id) {
// Возвращаем Optional, потому что пользователь может не существовать
}
То есть
Optional
— это про контракт на метод, а не про хранение данных.Если кратко:
- ✅ Используй
Optional
в сигнатурах методов, когда результат может отсутствовать.- ❌ Не используй
Optional
в полях и параметрах конструктора.А ты как используешь
Optional
в проектах? Был ли опыт с его неправильным применением? Пиши в комментах👇👉@BookJava
👍7❤4💩1
🧠
Многие знают, что можно заинжектить список строк из
Но знаете, что вы получите?
⚠️ ОШИБКУ.
📌 Решение — использовать
💡 Профит:
- работает с
- валидация через
- легко покрыть тестами;
- меньше магии.
⚠️
👉@BookJava
@Value
в Spring — это ловушка, если вы используете списки или map'ыМногие знают, что можно заинжектить список строк из
application.yml
вот так:
app:
langs:
- en
- fr
- de
@Value("${app.langs}")
private List<String> langs;
Но знаете, что вы получите?
⚠️ ОШИБКУ.
@Value
не умеет парсить YAML-массивы. Он ожидает строку, и даже с CSV-строкой (en,fr,de
) — всё не так очевидно: Spring не применяет ConversionService
для списков.📌 Решение — использовать
@ConfigurationProperties
:
app:
langs:
- en
- fr
- de
@ConfigurationProperties(prefix = "app")
@Component
public class AppProps {
private List<String> langs;
// геттеры/сеттеры
}
💡 Профит:
- работает с
List
, Map
, вложенными объектами;- валидация через
@Validated
и @NotEmpty
;- легко покрыть тестами;
- меньше магии.
⚠️
@Value
хорош для простых скаляров. Всё остальное — через @ConfigurationProperties
.👉@BookJava
👍23🔥4