Абстракция в Java
Абстракция — это способность выделять существенные характеристики объекта и упускать несущественные.
Абстракция позволяет сосредоточиться на важных свойствах и поведении объекта, скрыв детали реализации.
В Java абстракция реализуется с помощью абстрактных классов и интерфейсов.
Абстрактный класс содержит абстрактные методы без реализации. Подклассы обязаны реализовать эти методы.
Интерфейс задает «контракт», описывая поведение классов без деталей реализации. Классы реализуют интерфейс.
Реализация абстракции требует тщательного анализа предметной области и выделения общих свойств объектов.
✅  Java библиотека #java
Абстракция — это способность выделять существенные характеристики объекта и упускать несущественные.
Абстракция позволяет сосредоточиться на важных свойствах и поведении объекта, скрыв детали реализации.
В Java абстракция реализуется с помощью абстрактных классов и интерфейсов.
Абстрактный класс содержит абстрактные методы без реализации. Подклассы обязаны реализовать эти методы.
Интерфейс задает «контракт», описывая поведение классов без деталей реализации. Классы реализуют интерфейс.
Реализация абстракции требует тщательного анализа предметной области и выделения общих свойств объектов.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍10❤5🔥3
  Sorted set
SortedSet — это интерфейс в Java Collection Framework, который предоставляет упорядочение элементов в множестве. Элементы упорядочиваются с помощью их естественного порядка или с помощью компаратора, который обычно предоставляется при создании отсортированного множества.
SortedSet имеет несколько дополнительных операций, которые позволяют использовать упорядочение элементов:
— first() и last() возвращают первый и последний элементы в множестве соответственно.
— headSet(), tailSet() и subSet() возвращают подмножества элементов, которые находятся до, после или между заданными элементами соответственно.
В этом примере мы создаем TreeSet (класс, который реализует SortedSet) и добавляем в него несколько строк. Поскольку строки реализуют интерфейс Comparable, они упорядочиваются в алфавитном порядке. Затем мы используем различные методы SortedSet для получения первого и последнего элементов, а также подмножеств элементов.
✅  Java библиотека #java
SortedSet — это интерфейс в Java Collection Framework, который предоставляет упорядочение элементов в множестве. Элементы упорядочиваются с помощью их естественного порядка или с помощью компаратора, который обычно предоставляется при создании отсортированного множества.
SortedSet имеет несколько дополнительных операций, которые позволяют использовать упорядочение элементов:
— first() и last() возвращают первый и последний элементы в множестве соответственно.
— headSet(), tailSet() и subSet() возвращают подмножества элементов, которые находятся до, после или между заданными элементами соответственно.
В этом примере мы создаем TreeSet (класс, который реализует SortedSet) и добавляем в него несколько строк. Поскольку строки реализуют интерфейс Comparable, они упорядочиваются в алфавитном порядке. Затем мы используем различные методы SortedSet для получения первого и последнего элементов, а также подмножеств элементов.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍14❤4🔥4
  Временное хранение часто используемых данных в памяти для сокращения времени доступа.
- Получение данных из кэша (например, Redis, Memcached) гораздо быстрее, чем запросы к базе данных.
- Кэширование статических ресурсов (изображения, CSS, JS) снижает необходимость многократного запроса их с исходного сервера.
Распределение входящего сетевого трафика между несколькими серверами для предотвращения перегрузки одного сервера.
- Балансировка нагрузки предотвращает перегрузку одного сервера, что может замедлить отклик.
- Обеспечивает отказоустойчивость, гарантируя обработку запросов даже при выходе некоторых серверов из строя.
Обработка задач в фоновом режиме без блокировки основного потока выполнения, что позволяет системе продолжать обработку других запросов.
- Пользователям не нужно ждать завершения длительных задач (например, отправки электронной почты или обработки изображений).
Разделение базы данных на более мелкие части (шарды), которые можно распределить между несколькими серверами.
- Запросы могут выполняться параллельно на нескольких шардах, сокращая время получения данных.
- Распределение нагрузки предотвращает перегрузку одного экземпляра базы данных.
Распределенные сети серверов, которые доставляют веб-контент на основе географического расположения пользователя.
- Контент предоставляется с серверов, находящихся ближе к пользователю, сокращая физическое расстояние, которое данные должны преодолеть.
- Кэширует статический и динамический контент для ускорения его доставки.
Оптимизация работы баз данных через индексацию, оптимизацию запросов и правильное проектирование схемы.
- Ускоряет получение данных, позволяя базе данных находить записи без сканирования всех таблиц.
Сокращение числа промежуточных шагов, через которые проходят данные, и выбор эффективных протоколов связи.
- Каждый сетевой переход добавляет задержку; их минимизация ускоряет передачу данных.
Разделение задач на несколько параллельно выполняемых потоков или процессов для увеличения скорости выполнения операций.
- Параллельное выполнение задач позволяет обрабатывать данные быстрее за счёт разделения работы на несколько потоков.
- Более эффективное использование ресурсов процессора, что снижает задержки при выполнении сложных операций.
Предугадывание будущих запросов данных и их предварительная загрузка.
- Данные уже доступны, когда они запрашиваются, устраняя задержки при получении.
- Особенно эффективно в приложениях с предсказуемыми шаблонами доступа.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍12❤7🔥4
  CompletableFuture
CompletableFuture в пакете java.util.concurrent является классом, который предоставляет мощный и гибкий подход к асинхронному программированию. Он позволяет выполнять асинхронные операции и обрабатывать их результаты, комбинировать несколько операций и управлять зависимостями между ними.
Помимо операций, представленных на изображении, CompletableFuture также предоставляет множество других методов для работы с асинхронными операциями, таких как thenApply(), thenCompose(), thenCombine(), exceptionally() и другие, которые позволяют обрабатывать результаты, комбинировать операции, обрабатывать исключения и многое другое. Это делает CompletableFuture мощным инструментом для асинхронного программирования.
✅  Java библиотека #java
CompletableFuture в пакете java.util.concurrent является классом, который предоставляет мощный и гибкий подход к асинхронному программированию. Он позволяет выполнять асинхронные операции и обрабатывать их результаты, комбинировать несколько операций и управлять зависимостями между ними.
Помимо операций, представленных на изображении, CompletableFuture также предоставляет множество других методов для работы с асинхронными операциями, таких как thenApply(), thenCompose(), thenCombine(), exceptionally() и другие, которые позволяют обрабатывать результаты, комбинировать операции, обрабатывать исключения и многое другое. Это делает CompletableFuture мощным инструментом для асинхронного программирования.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍9🔥4❤3
  Агрегация: что это и когда использовать?
Агрегация — это тип отношения между классами, при котором один класс "владеет" экземпляром другого, но их жизненные циклы не зависят друг от друга. Это «слабое» отношение, так как объект одного класса может существовать независимо от объекта другого.
Пример:
🟢 В этом примере класс Car агрегирует объект Engine, но двигатель может существовать сам по себе, вне машины.
Агрегацию стоит использовать, когда один объект логически принадлежит другому, но их существование не связано напрямую. Например, библиотека и книги, где книги могут существовать без самой библиотеки
✅  Java библиотека #java
Агрегация — это тип отношения между классами, при котором один класс "владеет" экземпляром другого, но их жизненные циклы не зависят друг от друга. Это «слабое» отношение, так как объект одного класса может существовать независимо от объекта другого.
Пример:
class Engine {
    void start() {
        System.out.println("Двигатель запущен");
    }
}
class Car {
    private Engine engine;
    Car(Engine engine) {
        this.engine = engine;
    }
    void startCar() {
        engine.start();
        System.out.println("Машина поехала");
    }
}
public class Main {
    public static void main(String[] args) {
        Engine engine = new Engine(); // Двигатель может существовать отдельно
        Car car = new Car(engine);
        car.startCar();
    }
}Агрегацию стоит использовать, когда один объект логически принадлежит другому, но их существование не связано напрямую. Например, библиотека и книги, где книги могут существовать без самой библиотеки
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍31❤7🔥5
  Разберем новую фичу Java 21 — Scoped Values, которая пришла на замену (а точнее, в дополнение) к старому доброму ThreadLocal. Если вы когда-либо мучились с ThreadLocal в многопоточных приложениях, этот пост для вас.
ThreadLocal — это механизм для хранения данных, привязанных к потоку. Но у него есть недостатки:
— Данные остаются в потоке, даже когда уже не нужны (утечки памяти).
— Передавать данные в дочерние потоки неудобно.
— Нужно очистить данные вручную.
Scoped Values решают эти проблемы без магии и костылей.
Scoped Values (ScopedValue<T>) создаются только один раз и не изменяются после инициализации. Они передаются вглубь стека вызовов через метод ScopedValue.where(), а не через хранение в потоке, как ThreadLocal.
▪️ Пример кода с потоками
Допустим, есть обработчик запросов, который передает идентификатор пользователя.
— С ThreadLocal код выглядел бы так:
public class ThreadLocalExample {
    private static final ThreadLocal<String> USER = new ThreadLocal<>();
    public static void main(String[] args) {
        USER.set("Alice");
        new Thread(ThreadLocalExample::process).start();
    }
    private static void process() {
        System.out.println("User: " + USER.get()); // null: поток не видит значение
    }
}ThreadLocal привязан к потоку, а не к области выполнения. Значение не наследуется
Теперь переделаем на Scoped Values:
public class ScopedValueExample {
    private static final ScopedValue<String> USER = ScopedValue.newInstance();
    public static void main(String[] args) {
        ScopedValue.where(USER, "Alice").run(() -> {
            new Thread(ScopedValueExample::process).start();
        });
    }
    private static void process() {
        System.out.println("User: " + USER.get()); // ✅ Видит "Alice"
    }
}Scoped Values автоматически передают значение в новые потоки.
🎯 Где использовать Scoped Values
1. Контекст запроса (Request Context)
В веб-приложениях часто нужно передавать ID запроса или текущего пользователя через слои сервиса.
2. Логирование (Tracing & Logging)
Можно автоматически передавать traceId в логи.
3. Конфигурация временных параметров
Можно временно менять настройки для фрагмента кода.
— ScopedValue быстрее и безопаснее, так как нет необходимости очищать значения вручную.
— Отлично подходит для работы с виртуальными потоками.
— Ограничение: они неизменяемые (Immutable).
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍11❤3🔥3☃2
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍15❤5🔥3😁2
  ⚡️ Параллельные стримы: ускорение или нет?
Java предоставляет мощный инструмент для обработки данных — параллельные стримы. Они позволяют автоматически распределять вычисления по нескольким потокам, но их эффективность зависит от множества факторов.
Добавление parallelStream() бездумно — это не "оптимизация", а лотерея с шансом на баги и падение.
❌  Когда не использовать
— При небольшом наборе данных (<10 000 элементов) затраты на управление потоками могут превышать прирост скорости.
— Операции sorted(), distinct() или limit() требуют полного знания данных, что снижает эффективность параллельного выполнения.
— Вложенные parallelStream() в CompletableFuture или ExecutorService могут привести к конкуренции за ресурсы и неожиданному падению производительности.
✔️  Когда использовать
— Обработка больших объёмов данных (100 000+ элементов).
— Операции независимы и ресурсоёмки, например, сложные вычисления, парсинг файлов, загрузка данных из сети.
🔍  Важная особенность
parallelStream() использует ForkJoinPool.commonPool(). Если есть другие задачи, использующие этот же пул, они могут начать конкурировать за потоки, замедляя всё приложение.
💬  Делитесь в комментах интересными кейсами
✅  Java библиотека #java
Java предоставляет мощный инструмент для обработки данных — параллельные стримы. Они позволяют автоматически распределять вычисления по нескольким потокам, но их эффективность зависит от множества факторов.
Добавление parallelStream() бездумно — это не "оптимизация", а лотерея с шансом на баги и падение.
— При небольшом наборе данных (<10 000 элементов) затраты на управление потоками могут превышать прирост скорости.
— Операции sorted(), distinct() или limit() требуют полного знания данных, что снижает эффективность параллельного выполнения.
— Вложенные parallelStream() в CompletableFuture или ExecutorService могут привести к конкуренции за ресурсы и неожиданному падению производительности.
— Обработка больших объёмов данных (100 000+ элементов).
— Операции независимы и ресурсоёмки, например, сложные вычисления, парсинг файлов, загрузка данных из сети.
parallelStream() использует ForkJoinPool.commonPool(). Если есть другие задачи, использующие этот же пул, они могут начать конкурировать за потоки, замедляя всё приложение.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  1👍21❤3🔥3
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍5❤3🔥2
  Что такое JWT?
JWT (JSON Web Token) — это компактный формат токенов для безопасной передачи данных между сторонами. Используется для аутентификации и авторизации, особенно в веб-приложениях.
🟢 JWT состоит из трёх частей, разделённых точками
1️⃣  Header — тип токена и алгоритм подписи (например, HMAC или RSA).
2️⃣  Payload — полезная нагрузка (данные, например userId, roles).
3️⃣  Signature — цифровая подпись для защиты от подделки.
⚙️  Как работает
Клиент аутентифицируется, сервер создаёт JWT и отдаёт его клиенту. Затем при каждом запросе клиент передаёт JWT в заголовке Authorization: Bearer <token>. Сервер проверяет подпись и, если токен валиден, разрешает доступ.
⚠️  JWT самодостаточен: сервер не хранит состояние токенов. 
💬  Используете JWT в своих проектах?
✅  Java библиотека #java
JWT (JSON Web Token) — это компактный формат токенов для безопасной передачи данных между сторонами. Используется для аутентификации и авторизации, особенно в веб-приложениях.
Клиент аутентифицируется, сервер создаёт JWT и отдаёт его клиенту. Затем при каждом запросе клиент передаёт JWT в заголовке Authorization: Bearer <token>. Сервер проверяет подпись и, если токен валиден, разрешает доступ.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍20❤2
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍8❤2🔥2
  При использовании @Transactional Spring Data JPA по умолчанию отслеживает изменения загруженных сущностей для последующей фиксации. Но если вам нужно только чтение, добавьте:
@Transactional(readOnly = true)
Spring Data JPA переводит транзакцию в режим без грязных проверок (no dirty checking), что ускоряет выполнение, так как не отслеживает изменения в загруженных сущностях.
Также БД может оптимизировать запросы, зная, что изменений не будет, особенно СУБД с поддержкой уровня изоляции READ ONLY.
В обычной транзакции Spring Data JPA сохраняет копию каждой загруженной сущности, чтобы сравнить её состояние при коммите и зафиксировать изменения. С readOnly=true эта дорогостоящая операция пропускается, что снижает нагрузку на память и CPU.
— Сервисы, где нет операций save/update/delete.
— REST-эндпоинты, отдающие справочные данные.
— Запросы к отчетам и аналитике.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  1👍32🔥5❤3
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍11🔥4❤3
  Надоело писать одни и те же конструкции снова и снова? На помощь приходят Live Templates — инструмент, который позволит генерировать фрагменты кода по паре букв.
Live Templates — это заготовки кода, которые можно вставлять по сокращённым ключам. Например, вместо того чтобы каждый раз писать System.out.println(), достаточно написать sout и нажать Enter. IDEA сама развернёт код.
Live Templates поддерживают Java, Kotlin, JS, Groovy, SQL и XML/HTML.
Полный список live templates: File → Settings→ Editor → Live Templates.
Live Templates – это must-have инструмент для ускорения написания кода. Настройте под себя и забудьте про шаблонный код.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  1🔥30👍15❤7
  Наш чатик с вакансиями и резюме, присоединяйся:  https://t.iss.one/job_java
  
  Telegram
  
  Java Job - Вакансии и резюме
  Наш канал по Java @javalib
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
Вакансии Java, также можете скидывать свои резюме!
Купить звёзды: @PremiumBot
❤2👍2🔥2
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍22❤5🔥4
  Композиция: что это и когда использовать?
Композиция — это тип отношения, когда один класс жёстко связан с другим, и объекты не могут существовать независимо. Если контейнерный объект уничтожается, то и все объекты, которые он содержит, также будут уничтожены.
Пример:
🔹 В этом примере класс Human композирует объект Heart, и сердце не может существовать вне человека.
Композицию стоит использовать, когда объекты должны быть тесно связаны и уничтожаться вместе. Например, птица и её крылья — без птицы существование крыльев не имеет смысла.
✅  Java библиотека #java
Композиция — это тип отношения, когда один класс жёстко связан с другим, и объекты не могут существовать независимо. Если контейнерный объект уничтожается, то и все объекты, которые он содержит, также будут уничтожены.
Пример:
class Heart {
    void beat() {
        System.out.println("Сердце бьется");
    }
}
class Human {
    private final Heart heart;
    Human() {
        this.heart = new Heart(); // Сердце создаётся вместе с человеком
    }
    void live() {
        heart.beat();
        System.out.println("Человек живёт");
    }
}
public class Main {
    public static void main(String[] args) {
        Human human = new Human();
        human.live();
    }
}🔹 В этом примере класс Human композирует объект Heart, и сердце не может существовать вне человека.
Композицию стоит использовать, когда объекты должны быть тесно связаны и уничтожаться вместе. Например, птица и её крылья — без птицы существование крыльев не имеет смысла.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍17❤6🔥3
  Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍19🔥8❤5
  Selector
Класс Selector используется для организации многоканального неблокирующего ввода-вывода.
Основная идея в том, что Selector позволяет одному потоку следить за состоянием множества каналов (сокетов, файловых каналов) и обрабатывать их события (готовность к чтению/записи).
Возможности Selector:
— Регистрация множества каналов в Selector для мониторинга.
— Проверка готовности зарегистрированных каналов к операциям чтения, записи.
— Извлечение готовых каналов и выполнение операций с ними.
— Отмена регистрации каналов в Selector.
Использование Selector позволяет избежать блокировки на операциях чтения/записи по каналам и эффективно масштабировать приложение для одновременной работы с большим количеством соединений.
Класс часто применяется в сетевых серверах для неблокирующей обработки большого числа клиентских соединений в одном потоке.
✅  Java библиотека #java
Класс Selector используется для организации многоканального неблокирующего ввода-вывода.
Основная идея в том, что Selector позволяет одному потоку следить за состоянием множества каналов (сокетов, файловых каналов) и обрабатывать их события (готовность к чтению/записи).
Возможности Selector:
— Регистрация множества каналов в Selector для мониторинга.
— Проверка готовности зарегистрированных каналов к операциям чтения, записи.
— Извлечение готовых каналов и выполнение операций с ними.
— Отмена регистрации каналов в Selector.
Использование Selector позволяет избежать блокировки на операциях чтения/записи по каналам и эффективно масштабировать приложение для одновременной работы с большим количеством соединений.
Класс часто применяется в сетевых серверах для неблокирующей обработки большого числа клиентских соединений в одном потоке.
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍11❤5🔥3
  Media is too big
    VIEW IN TELEGRAM
  Java и gRPC: быстрый старт со Spring Boot | Преимущества, Настройка и Использование
Сегодня у нас QuickStart и обзор ныне очень популярной технологии - gRPC, оставляйте свое мнение в комментариях и читайте описание, приятного! :)
📺 🗣 СМОТРЕТЬ RUTUBE
🌐 🗣 СМОТРЕТЬ VKVIDEO
@javalib #java
Сегодня у нас QuickStart и обзор ныне очень популярной технологии - gRPC, оставляйте свое мнение в комментариях и читайте описание, приятного! :)
@javalib #java
Please open Telegram to view this post
    VIEW IN TELEGRAM
  👍17❤3🔥2