Java библиотека
31.5K subscribers
2.37K photos
90 videos
10 files
2.18K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
Готовы перейти от разработки к управлению людьми и проектами?

8 октября в 20:00 МСК приглашаем на открытый урок «Всё о курсе Team Lead: прямой разговор с руководителем программы». На вебинаре мы честно расскажем, что ждёт студентов на курсе, какие темы будут разобраны и какую ценность вы получите. Это возможность услышать инсайды о программе из первых уст и задать любые вопросы напрямую руководителю.

Урок будет полезен тем, кто уже задумывается о переходе в роль тимлида: старшим инженерам, начинающим руководителям и всем, кто хочет развиваться в IT-менеджменте.

➡️ Зарегистрируйтесь сейчас и узнайте, как повышение квалификации поможет вам вырасти в эффективного лидера: https://vk.cc/cQ7te6

🎁 Все участники вебинара получат промокод, дающий скидку на обучение на курсе «Team Lead» 15%

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍3🔥32
👩‍💻 Интеграция системы логирования с Logback в Spring Boot

Ищете, как настроить логирование в приложении на Spring Boot? Используйте Logback для эффективного логирования и управления уровнями логов. Используйте AI для ускорения процесса.

📝 Промпт:


Generate a logging system integration for a Spring Boot 3 application using Logback.

— Set up logback-spring.xml for flexible configuration of logging levels and appenders.
— Define rolling file appender to archive old log files based on size or date.
— Configure log format with PatternLayoutEncoder for structured and readable logs.
— Implement different logging levels (INFO, WARN, ERROR) for different components of the application.
— Integrate MDC (Mapped Diagnostic Context) for tracking user sessions or specific requests.
— Set up asynchronous logging with AsyncAppender to improve performance in high-traffic applications.
— Enable console logging for development and file logging for production environments.


💡 Расширения:

— Добавьте Set up rolling file appender for log rotation based on size or date для архивирования старых логов.
— Добавьте Implement asynchronous logging with AsyncAppender для улучшения производительности в высоконагруженных приложениях.
— Добавьте Integrate custom appenders for external monitoring systems like Elasticsearch or Splunk для интеграции с внешними системами мониторинга.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍43
👩‍💻 Магия IntelliJ IDEA: Multi-Caret Editing

Хотите править код сразу в нескольких местах? Multi-Caret Editing позволяет поставить несколько курсоров и синхронно редактировать текст.

🟢Что делает

— Позволяет редактировать одинаковые участки кода одновременно
— Ускоряет массовое переименование переменных, правки форматирования и шаблонных конструкций
— Работает не только в коде, но и в файлах конфигурации, JSON, XML

🟢Зачем это нужно

— Экономит время при рутинных правках
— Снижает вероятность пропустить один из повторяющихся фрагментов
— Делает код-ревью и рефакторинг быстрее

🟢Как использовать

— Выделите слово и нажмите Alt+J (Windows/Linux) или Ctrl+G (macOS) — добавится второй курсор
— Продолжайте нажимать, чтобы выбрать следующие вхождения
— Для выбора сразу всех вхождений используйте Ctrl+Alt+Shift+J
— Для произвольных позиций используйте Alt+Click для добавления курсора в нужное место

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥139👍4
Интеграционные тесты с Testcontainers

Пошаговая настройка тестов на Spring Boot 3 с Testcontainers + PostgreSQL: быстро, изолированно, воспроизводимо.

1️⃣Зависимости (Maven/Gradle)

— Maven (pom.xml):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-bom</artifactId>
<version>1.20.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
</dependencies>


— Gradle (Kotlin DSL):
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
testImplementation("org.flywaydb:flyway-core")
testImplementation("org.postgresql:postgresql")
testImplementation(platform("org.testcontainers:testcontainers-bom:1.20.3"))
testImplementation("org.testcontainers:junit-jupiter")
testImplementation("org.testcontainers:postgresql")
}


2️⃣Включаем Testcontainers

C Spring Boot 3.1 контейнер можно подключить одной аннотацией без ручного прописывания spring.datasource.*.
@Testcontainers
@ExtendWith(SpringExtension.class)
@SpringBootTest
class PostgresIT {

@Container
@ServiceConnection // Spring сам подставит URL/логин/пароль в DataSource
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:16-alpine")
.withDatabaseName("app")
.withUsername("app")
.withPassword("secret");

@Test
void contextLoads() {
// проверяем, что контекст и datasource поднялись на контейнере
}
}


3️⃣Миграции для тестов (Flyway)

Положите миграции в src/test/resources/db/migration (отдельно от продовых — удобно для фикстур):
src/
└─ test/
└─ resources/
└─ db/
└─ migration/
├─ V1__init.sql
└─ V2__seed.sql


4️⃣Ускоряем прогоны

🔘Reusable containers (кэшируемый демон): добавьте в ~/.testcontainers.properties
testcontainers.reuse.enable=true

и .withReuse(true) для контейнера в тесте.

🔘Singleton-паттерн контейнера: вынесите контейнер в общий абстрактный класс теста, чтобы один контейнер работал на все тесты.

5️⃣Полезные трюки и подводные камни

— Если на MacOS/Colima, проверьте доступность Docker API (docker info) перед тестами.
— Для детерминизма фиксируйте теги образов (например, postgres:16-alpine), не latest.
— Логи контейнеров доступны: postgres.followOutput(...) — удобно для диагностики нестабильных тестов.
— Если нужен R2DBC: поднимайте Postgres как выше, а в application-test.yml указывайте r2dbc URL; @ServiceConnection корректно сконфигурирует оба коннектора, если они в classpath.
— Тяжёлые фикстуры → создавайте через SQL-маски (V*_seed.sql) или @Sql прямо в тестах — не смешивайте тестовые данные с продовыми миграциями.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍108🔥4
👩‍💻 Чек-лист по Spring Boot профилям

Чтобы не путаться в окружениях и не тащить dev в прод 🚨 — держите компактный список best practices.
Карточка для сохранения👆🏻

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1411🔥4
🕯 Паттерн Observer (Наблюдатель)

Observer — это поведенческий паттерн, который создаёт механизм подписки, позволяющий одним объектам следить и реагировать на изменения состояния других объектов. Наблюдатель предоставляет гибкую систему взаимодействия между объектами, исключая жесткую связанность.

Использование:

🟢Когда нужно оповещать несколько объектов об изменениях состояния другого объекта.
🟢Когда важно обеспечить слабую связанность между компонентами системы.
🟢При разработке систем, где одни объекты должны реагировать на изменения в других, без жёсткой привязки.

Преимущества:

1️⃣ Обеспечивает слабую связанность между объектами.
2️⃣ Упрощает динамическое добавление новых наблюдателей без изменения кода субъекта.
3️⃣ Позволяет множеству объектов реагировать на события.

Недостатки:

1️⃣ Может приводить к большим накладным расходам при большом количестве наблюдателей.
2️⃣ Потенциальная сложность отладки из-за непредсказуемого порядка оповещения.
3️⃣ Может возникнуть ситуация, когда наблюдатели получают неконсистентное состояние.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥6👍4
Тип Optional

Тип Optional используется для представления возможности отсутствия значения. Он обертывает другой тип данных и может содержать либо значение этого типа, либо быть пустым (null).

Этот код создает Optional объект, который может содержать строку. Если строка доступна, она будет возвращена; в противном случае будет возвращено значение «Default Value».

Использование Optional способствует более чистому и безопасному коду при работе с возможно отсутствующими значениями.


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍115🔥3
Media is too big
VIEW IN TELEGRAM
Java. Исключение ConcurrentModificationException.

В видео рассматривается, что из себя представляет исключение ConcurrentModificationException, и в каких случаях оно выбрасывается.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍86🔥3
Интерфейс BlockingQueue

Интерфейс BlockingQueue используется для реализации очередей с блокировками.
Он позволяет безопасно работать с очередью из нескольких потоков.

Основные методы:
add(E e) — добавляет элемент в очередь, может выбросить исключение если очередь переполнена.
offer(E e) — добавляет элемент в очередь, возвращает false если очередь переполнена.
put(E e) — добавляет элемент в очередь, блокирует поток если очередь переполнена.
take() — извлекает и удаляет элемент из очереди, блокирует поток если очередь пуста.
poll() — извлекает и удаляет элемент из очереди, возвращает null если очередь пуста.


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5🔥4
Хотите собрать свой мини-Google? 🚀
🗓 22 октября, 20:00 приглашаем на открытый урок OTUS «Мини-поисковик своими руками». На этом вебинаре вы создадите поисковик с нуля — без готовых библиотек и магии. Только алгоритмы и код.

Разберём, как:
• объединить КМП и префиксное дерево;
• реализовать автодополнение и подсчёт вхождений;
• оптимизировать поиск под большие тексты;
• превратить всё это в маленький, но работающий офлайн-поисковик.

После вебинара вы сможете самостоятельно:
— строить индекс слов и быстро искать по нему;
— собирать статистику запросов;
— понять, как внутри устроены поисковики.

Открытый урок проходит в преддверие старта курса «Алгоритмы и структуры данных». Все участники получат скидку на обучение.

Присоединяйтесь 22 октября в 20:00:

https://vk.cc/cQkfK4

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
6👍4🔥2🤩1
👩‍💻 IntelliJ IDEA: Bookmarks и Context Bookmarks

Большие проекты → десятки файлов → сотни классов. Иногда нужно быстро вернуться к «тем самым» местам в коде. В ход идут Bookmarks — и особенно Context Bookmarks.

🟢Что делает

— Позволяет отмечать строки или файлы как закладки
— Поддерживает нумерацию (быстрый переход по цифре)
— Context Bookmarks автоматически привязывают закладки к рабочему контексту (ветке, задаче)

🟢Зачем это нужно

— Удобно при отладке: отмечаете подозрительные места и прыгаете между ними
— Можно держать список TODO прямо в коде, без комментариев
— Context Bookmarks запоминают, что именно важно для текущей задачи, и не мешают в будущем

🟢Как использовать

— Обычная закладка: F11 (Windows/Linux) или F3 (macOS)
— Закладка с номером: Ctrl+Shift+<цифра> (Windows/Linux) или ⌘⇧<цифра> (macOS)
— Быстрый переход: Ctrl+<цифра>
— Context Bookmarks: активируются в View → Tool Windows → Bookmarks

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍8🔥4
Практикум, который снимет боль про микросервисы, о которой все молчат.

Sync vs Async: что убьёт ваш проект, а что спасёт?

15 октября, 19:00 — практический вебинар для разработчиков, архитекторов и девопсеров от OTUS. Работаем вместе с Олегом Голенищевым, Senior .NET-разработчиком Directum, преподавателем Microsoft.

Приходи, если хочешь:
Понимать, где Sync — мастхэв, а где Async — единственный шанс выжить
Получить FANG-уровня чек-лист по интеграции (и бонус — шаблоны конфигов Spring Boot для Kafka и RabbitMQ)
Забрать 7% скидку на любой курс OTUS (именно так, просто за регистрацию)
Не попасть в “клуб тех, кто строил микросервисы по учебнику, а теперь переписывает всё с нуля”

Запишись, чтобы не чинить то, что можно не ломать.
Запись, подарки и скидка — только для своих. Лови шанс — кликай на регистрацию: https://tglink.io/5e288b078610

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFHz1yep
3👍3🔥2
👀 Задачи с собеседований: Сортировка пузырьком (jun)

- Расскажите про сортировку пузырьком и реализуйте её.

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

💡 Ключевые моменты:

▪️ Худший случай: O(n^2)
▪️ Используется строго для небольших наборов данных.

Реализация на картинке 👆

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍144🔥4
🔍Тестовое собеседование с Java-разработчиком из Мегафон уже завтра

15 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Мария Пивоварова, старший разработчик в Мегафон, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Мария будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Марии

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3🔥2
Блокирующий метод

Блокирующий метод (blocking method) — это метод, который приостанавливает выполнение текущего потока и ждет определенного события или условия.
Они используются для синхронизации потоков, например при работе с сетью или файлами.

При вызове блокирующего метода поток переходит в состояние ожидания и не выполняет других операций.

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

Например, метод readLine() блокирует поток до тех пор, пока пользователь не введет строку и не нажмет Enter.
После ввода данных метод возвращает управление потоку и программа выводит введенную строку.

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


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍7🔥4
Твой шанс прокачаться в ИТ, заявить о себе на всю страну и побороться за призовой фонд 10 250 000 рублей 💰 Успей зарегистрироваться до 20 октября.

МТС приглашает на True Tech Champ — всероссийский чемпионат по программированию. Выбирай трек по душе или участвуй сразу в двух, чтобы увеличить шансы на победу.

Трек 1. Алгоритмический. Индивидуальный зачет
Работай со структурами данных, решай алгоритмические задачи и сражайся в лайв-кодинге с сильнейшими.

Трек 2. Программирование роботов. Командный формат
Сначала проведи робота по виртуальному лабиринту, затем управляй им дистанционно на офлайн-полигоне, а в финале — пройди испытания на реальной площадке и выбей соперников с платформы.

🎁 Организаторы отправят командам финалистов по одному роботу Waveshare Cobra Flex для кастомизации. После соревнований они останутся у участников в качестве подарка.

Тебя ждет:
— Зрелищный шоу-финал с искусственным интеллектом, цифровыми аватарами и другими технологиями.
— Конференция с лидерами индустрии, кодерские челленджи и возможность прокачать ИТ-навыки.
— Шанс лично пообщаться с HR-специалистами МТС и получить карьерный буст.

📍Шоу-финал пройдет 21 ноября в МТС Live Холл.
Успей зарегистрироваться до 20 октября
4🔥3👍2
Media is too big
VIEW IN TELEGRAM
👩‍💻 learn java in 10 minutes. NO MORE PSVM

In this Java tutorial crash course, I’ll teach you the Java programming language from scratch. Whether you’re a beginner or just curious about how Java works, this video covers everything you need to know to get started fast.

What you’ll learn in this video:

• What is Java and why it’s still one of the most popular programming languages
• How to install and use IntelliJ IDEA for Java development
• Writing your first Java program (System.out.println)
• Working with variables (strings, numbers, booleans)
• Creating and using methods
• Writing if statements and basic logic
• Understanding objects, classes, and records
• Using lists and looping through data


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4😁43
Принципы SOLID

Как разработчики, мы стремимся к тому, чтобы наш код был поддерживаемым, масштабируемым и готовым к изменениям. Один из способов достичь этого — следовать принципам SOLID. Эти пять принципов проектирования помогают создавать системы, которые легко понимать и поддерживать, что ведет к более чистому и надежному коду.

Рассмотрим каждый принцип:

1️⃣ Принцип единственной ответственности (S)
Каждый класс должен иметь только одну причину для изменения, то есть он должен отвечать за одну задачу или ответственность. Это достигается за счет того, что классы фокусируются на выполнении конкретных задач. Соблюдение этого принципа делает код более модульным и простым в поддержке.

2️⃣ Принцип открытости/закрытости (O)
Классы должны быть открыты для расширения, но закрыты для изменения. Это значит, что поведение класса можно расширять, не изменяя его существующий код. В Java это часто реализуется через использование интерфейсов или абстрактных классов.

3️⃣ Принцип подстановки Барбары Лисков (L)
Объекты суперкласса должны заменяться объектами подкласса без нарушения корректности программы. В Java это особенно важно при работе с наследованием, чтобы подклассы правильно расширяли базовые классы, не изменяя их поведение.

4️⃣ Принцип разделения интерфейса (I)
Клиенты не должны зависеть от интерфейсов, которые они не используют. В Java это достигается путем разделения крупных интерфейсов на более узкоспециализированные, чтобы классы реализовывали только те методы, которые им действительно нужны.

5️⃣ Принцип инверсии зависимостей (D)
Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. В Java это часто реализуется через внедрение зависимостей (Dependency Injection), которое позволяет передавать зависимости извне, что способствует слабой связности и гибкости системы.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥85
🔥16 октября в 20:00 мск — открытый вебинар в OTUS!

О чём?

Хотите объединять данные из разных источников в PostgreSQL без сложных ETL-процессов? Foreign-Data Wrappers (FDW) позволяют превратить PostgreSQL в мощный центр управления данными из внешних баз, облачных хранилищ и систем больших данных.

Что разберём:


- Foreign-Data Wrappers: как они работают в PostgreSQL.
- Интеграция: подключение к внешним базам (MySQL, MongoDB и др.) и управление данными как локальными таблицами.
- Примеры: объединение данных из разных источников без ETL.
- Облачные решения: использование FDW с облачными хранилищами и Big Data.
- Оптимизация: лучшие практики настройки FDW для высокой производительности.

🎓 После вебинара вы:

- Научитесь подключать PostgreSQL к внешним источникам через FDW.
- Освоите настройку и интеграцию данных для гибридных систем..

🔧 Присоединяйтесь, чтобы раскрыть потенциал PostgreSQL и упростить интеграцию данных в ваших проектах!

👉 Зарегистрироваться https://vk.cc/cQnyg6

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

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍32🔥2
CompletableFuture

CompletableFuture — это класс в Java, введенный в Java 8, который представляет собой асинхронную задачу, которая будет выполнена в будущем и возвращает результат. CompletableFuture предоставляет множество методов для работы с асинхронными задачами, комбинирования их и управления их выполнением.

Основные возможности CompletableFuture включают:

— Вы можете запустить задачу асинхронно и продолжить выполнение кода без блокировки.
— CompletableFuture позволяет комбинировать результаты нескольких задач, выполняя определенные действия при завершении каждой задачи.
— Вы можете указать обработчики ошибок для обработки исключений, возникающих во время выполнения задачи.
— Вы можете блокировать выполнение кода и ждать завершения задачи.


Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥64