Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
🕯 Паттерн Фасад (Facade)

Фасад — это структурный паттерн, который предоставляет унифицированный интерфейс для работы с набором сложных подсистем. Он скрывает сложность системы и упрощает взаимодействие с ней, предоставляя более простой и понятный API для клиента.

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

🔹 Когда система состоит из множества классов, и нужно упростить доступ к её функционалу.
🔹 Когда нужно предоставить клиенту единый интерфейс для работы с несколькими подсистемами.
🔹 Когда необходимо уменьшить зависимость между клиентом и сложной системой, скрыв внутренние детали реализации.

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

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

Недостатки:

1️⃣ Может скрывать избыточную функциональность, ограничивая возможности системы.
2️⃣ Увеличивает количество кода за счёт добавления нового фасадного класса.
3️⃣ Если фасад слишком абстрактен, может стать сложным для понимания и поддержки.

📌 Паттерн Фасад полезен, когда нужно объединить несколько подсистем под один общий интерфейс, делая систему более удобной и простой для использования. Например, при работе с библиотеками, требующими сложной настройки, или в крупных проектах, где взаимодействие с множеством компонентов может стать запутанным. Фасад помогает улучшить архитектуру и повысить удобство работы с системой.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Подпишись на нашу еженедельную email-рассылку, чтобы быть в курсе последних открытий и тенденций в мире бэкенда.

В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования

👉Подписаться👈
#дайджест #Javadevjob

Вакансии Java разработчиков уровня Junior

▪️ Junior Java Developer
Гибрид (Санкт-Петербург), Just AI
Подробнее

▪️ Junior Java Developer
Офис (Москва) / Удалёнка, Trend Soft
Подробнее

Вакансии Java разработчиков уровня Middle

▪️ Java-разработчик
Офис (Москва), Газпромбанк
Подробнее

▪️ Java Developer (middle+)
Удалёнка, ОЦРВ
Подробнее

Вакансии Java разработчиков уровня Senior

▪️ Java-разработчик (проект СЭД)
Офис (Москва), Гринатом
Подробнее

▪️ Java Developer + ELK
Удалёнка, Hoff Tech
Подробнее

Понравились вакансии?
❤️ — да
🤔 — нет
🖥 Освежите свои знания о CompletableFuture

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

🔗 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Ключевое слово volatile

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

▪️ Синхронизация чтения и записи: Переменная, помеченная как volatile, всегда будет читать свое значение из основной памяти, а не из локальных кешей потоков.
▪️ Обеспечение видимости: Когда один поток изменяет значение переменной, все другие потоки немедленно видят эти изменения.
▪️ Отсутствие блокировок: В отличие от использования synchronized, volatile не блокирует выполнение потоков, что делает его более легковесным способом синхронизации.

Когда использовать volatile?
- Когда переменная должна быть доступна для записи и чтения несколькими потоками, но нет необходимости в сложной синхронизации (например, для флагов, флагов завершения, индикаторов состояний).
- В случаях, когда нужно просто гарантировать видимость изменений, но не требуется атомарность или операции с несколькими шагами (для этих случаев лучше использовать synchronized или java.util.concurrent).

Пример:
public class VolatileExample {
private static volatile boolean flag = false;

public static void main(String[] args) throws InterruptedException {
Thread writer = new Thread(() -> {
try {
Thread.sleep(1000); // эмулируем задержку
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
flag = true;
System.out.println("Flag set to true");
});

Thread reader = new Thread(() -> {
while (!flag) {
}
System.out.println("Flag is now true");
});

writer.start();
reader.start();

writer.join();
reader.join();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Привет, друзья! 👋

2024-й год подходит к концу, и пока LLM не написали за нас все программы, а квантовые компьютеры не взломали все пароли, самое время подвести итоги. Какие технологии действительно «выстрелили», а какие не оправдали ожиданий? Что изменилось в работе разработчиков, и какие навыки оказались самыми востребованными?

💻 Поделитесь своим мнением, и самое важное и интересное войдет в нашу статью. 🏆
ℹ️ Что такое "Проблема бриллианта" (Diamond Problem)?

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

В Java множественное наследование классов не поддерживается, но проблема все равно может возникнуть при использовании интерфейсов.

interface A {
void method();
}

interface B extends A {
@Override
default void method() {
System.out.println("Method from B");
}
}

interface C extends A {
@Override
default void method() {
System.out.println("Method from C");
}
}

class D implements B, C { }

public class Main {
public static void main(String[] args) {
D d = new D();
d.method(); // Какая версия метода будет вызвана?
}
}


📌 В чем суть проблемы?

Когда класс D реализует оба интерфейса B и C, которые оба предоставляют дефолтные реализации метода method(), возникает неопределенность — какую версию метода должен использовать класс D? При компиляции будет выброшен error: class D inherits unrelated defaults for method() from types B and C.

Это решается с помощью явного переопределения метода в классе D, что позволяет избежать конфликтов.

class D implements B, C {
@Override
public void method() {
B.super.method();
// или можно использовать C.super.method(), если хотите вызвать метод из C
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔼 Roadmap от джуна до сеньора

🔹 Инструменты для работы в команде: Освойте Jira, Confluence, Slack, MS Teams, Zoom и другие.
🔹 Языки программирования: Углубитесь в 1-2 языка, например, Python, С#.
🔹 Разработка API: Изучите REST, GraphQL, gRPC.
🔹 Серверы и хостинг: Ознакомьтесь с AWS, Azure, GCP, Kubernetes.
🔹 Аутентификация и тестирование: Освойте JWT, OAuth2, TDD и нагрузочное тестирование.
🔹 Базы данных: Работайте с SQL (Postgres, MySQL) и NoSQL (MongoDB).
🔹 CI/CD: Изучите GitHub Actions, Jenkins.
🔹 Алгоритмы: Разберитесь в Big O, деревьях, графах.
🔹 Системный дизайн: Погрузитесь в кэширование, микросервисы, балансировку нагрузки.
🔹 Паттерны проектирования: Изучите DI, фабрику и другие паттерны.
🔹 AI-инструменты: Научитесь использовать GitHub Copilot, ChatGPT.

💬 Какие пункты вы бы ещё добавили?
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 Как работает CopyOnWriteArrayList под капотом?

CopyOnWriteArrayList — это потокобезопасная реализация списка, оптимизированная для сценариев с частым чтением и редкими изменениями. Когда происходит изменение в CopyOnWriteArrayList, создаётся новая копия базового массива, в которую вносятся изменения. Таким образом, чтение и запись изолированы: до завершения модификации читающие потоки получают доступ к старому массиву, а запись завершает свою работу, не блокируя других потоков.

💡 Основные механизмы:

🔹 До завершения операции модификации все читающие потоки продолжают работать с текущей неизменяемой версией массива.
🔹 При вызове методов, изменяющих список (например, add, remove), создаётся новый массив на основе старого. Изменения применяются именно к новому массиву.
🔹 После завершения модификации ссылка на массив обновляется на новую версию. Теперь все новые операции чтения будут работать с обновлённой версией.

⚠️ Особенности:

▪️ Высокие накладные расходы на запись из-за создания копий.
▪️ Подходит для случаев, где чтение доминирует над изменением.
▪️ Не рекомендуется для сценариев с частыми обновлениями из-за увеличения потребления памяти.

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

Документация
Please open Telegram to view this post
VIEW IN TELEGRAM
🎄🎅 Настало время решать весёлые, праздничные головоломки по программированию

Advent of Code 2024 — адвент-календарь с небольшими головоломками по программированию. Всё, что вам нужно для участия, — это немного знаний в области программирования. Решать можно на любом ЯП.

👉 Врывайтесь, ведь позади уже шесть дней
🕯 Паттерн Посетитель (Visitor)

Visitor — это поведенческий паттерн, который позволяет добавлять новые операции к объектам без изменения их классов. Он выделяет операции в отдельный объект, называемый "посетитель", что позволяет избежать дублирования кода и поддерживать open/closed архитектуру.

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

🔹 Когда нужно добавлять новые операции к иерархии классов без изменения их структуры.
🔹 Когда объектам требуется обработка, зависящая от их типов, но нежелательно добавлять логику внутрь самих классов.

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

1️⃣ Упрощает добавление новых операций.
2️⃣ Логика работы концентрируется в одном месте, а не размазывается по классам.
3️⃣ Сохраняется открытость к изменениям операций и закрытость классов к модификациям.

Недостатки:


1️⃣ Увеличивает количество классов.
2️⃣ Добавление нового типа в иерархию требует обновления всех существующих посетителей.
3️⃣ Работает лучше всего с фиксированной иерархией.

📌 Visitor идеально подходит для сценариев, где требуется частое добавление новых операций при сохранении стабильности классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🐍☕️ Тайные питонисты среди нас?

Не секрет, что среди Java-разработчиков скрываются те, кто втайне любит Python. Кто украдкой пишет скрипты на Python для автоматизации или просто мечтает о жизни без фигурных скобок.

📌 Пройдите тест и проверьте, не живет ли внутри вас тайный питонист.

P.S. Не волнуйтесь, никто не будет осуждать, если вам вдруг понравится 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
#дайджест #Javadevjob

Вакансии Java разработчиков уровня Junior

▪️ Junior Java разработчик (Стажер)
Офис (Санкт-Петербург), Центр финансовых технологий
Подробнее

▪️ Junior Java Developer (Пенза)
Офис (Пенза), Тортуга
Подробнее

Вакансии Java разработчиков уровня Middle

▪️ Java-разработчик
Офис (Москва, Санкт-Петербург, Екатеринбург) / Удалёнка, Т-Банк
Подробнее

▪️ Middle+ Java разработчик
Гибрид (Москва), СберКорус
Подробнее

Вакансии Java разработчиков уровня Senior

▪️ Java-разработчик Middle\Senior
Удалёнка, RedLab
Подробнее

▪️ Senior Java разработчик
Удалёнка / Офис (Москва), Синхро
Подробнее

Понравились вакансии?
❤️ — да
🤔 — нет
🐛🔍 Как найти баг в 2088 коммитах с помощью git bisect

Метод git bisect — мощный инструмент для поиска изменения, вызвавшего баг в коде: с его помощью разработчику удалось быстро локализовать проблему, просмотрев всего 11 коммитов вместо изначальных 2088.

Задача: найти конкретный коммит, который вызвал регрессионную ошибку в проекте.

Исходные данные:
✔️ Ошибка была зарегистрирована 21 октября. Она находится в текущей версии на ветке main.
✔️ Ошибка отсутствует в более ранней версии, которая была выделена в отдельную ветку release-5.7.0.
✔️ Ветку release-5.7.0 создали 2 месяца назад, а с тех пор в ветке main было сделано много изменений — баг может находиться в любом из нескольких тысяч коммитов, которые невозможно быстро просмотреть.

🔗 Читать статью
🔗 Зеркало