en
Feedback
Java | Фишки и трюки

Java | Фишки и трюки

Open in Telegram

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna

Show more
6 953
Subscribers
-324 hours
-27 days
+630 days
Posts Archive
✈️ Профессиональное тестирование для IT-бизнеса – скидка 50% на пилотный проект! Глубокая экспертиза в QA на Java. Устали от
✈️ Профессиональное тестирование для IT-бизнеса – скидка 50% на пилотный проект! Глубокая экспертиза в QA на Java. Устали от задержек релизов и позднего обнаружения багов? Мы знаем, как ускорить разработку в рамках бюджета. Кто мы? Команда QA-экспертов, на рынке с 2009 года. Успешно протестировали 530+ проектов для IT-компаний в разных сферах. Предлагаем комплексное тестирование на максималках: сайтов, приложений, ПО.☝Мы помогаем сохранять компаниям конкретные ресурсы: время и деньги. Вот реальные результаты: 🤑 28 млн рублей экономии для e-commerce платформы перед Чёрной пятницей; 🤑 9 млн рублей сохранено крупному холдингу при оценке ERP-системы перед приёмкой у китайского разработчика; 🤑 25% сокращения затрат на разработку для fintech-стартапа. Запишитесь на пилотный проект со скидкой 50%. Протестируем ваш продукт 1-2 недели и предоставим полный отчёт о найденных дефектах, документацию и рекомендации. ➡️Заходите в наш телеграм-бот прямо сейчас, пока есть слоты на выгодный пилот. А ещё в боте можно скачать полезные гайды, в том числе и для джавистов, заходите! #реклама О рекламодателе erid: 2W5zFHyxahv

☕️ Что такое Lombok и зачем он нужен Если ты устал писать getters, setters, equals, toString, конструкторы и билдеры вручную — библиотека Lombok создана для тебя. Это мощный инструмент, который избавляет от шаблонного кода и делает Java-классы чище. Вот как он работает и почему это стоит подключить уже сегодня 👇 🟢 Шаг 1: Что такое Lombok?
Lombokэто Java-библиотека, которая с помощью аннотаций генерирует код во время компиляции. Ты не видишь этих методов в коде, но они есть в .class-файле.
➡️ Экономит сотни строк кода и улучшает читаемость. 🟢 Шаг 2: Как подключить? Для Maven:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>
Для Gradle:
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'
📌 Также убедись, что у тебя установлен Lombok plugin в IntelliJ IDEA / Eclipse! 🟢 Шаг 3: Убираем шаблонный код Без Lombok:
public class User {
    private String name;
    private int age;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }

    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}
С Lombok:
import lombok.Data;

@Data
public class User {
    private String name;
    private int age;
}
➡️ Всё то же самое, но в 3 строки! @Data создаёт: get/set, toString(), equals(), hashCode() и конструктор по умолчанию. Часто используемые аннотации Lombok
@Getter @Setter         // Только геттеры и сеттеры
@NoArgsConstructor      // Пустой конструктор
@AllArgsConstructor      // Конструктор со всеми полями
@RequiredArgsConstructor // Только для final / @NonNull полей
@Builder                // Шаблон Builder
@ToString               // Авто toString()
@EqualsAndHashCode      // equals() + hashCode()
@Value                  // Immutable класс (все final)
➡️ Всё это убирает десятки строк шаблонного кода. 🟢 Пример с @Builder
import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class Product {
    private String name;
    private double price;
    private boolean available;
}

Product p = Product.builder()
    .name("MacBook")
    .price(2499.99)
    .available(true)
    .build();

System.out.println(p);
➡️ Идеально для создания объектов с множеством параметров. 🗣️ Запомни: Lombok — это не магия, а компиляция. Он просто пишет за тебя шаблонный код.

🔥 Самые нужные каналы для Java разработчика, чтобы расти в доходе 💸Java | Вопросы собесовJava | Вакансии с удаленкойJava | LeetCodeJava | Тесты Подпишись, чтобы не потерять ☝️

🌐 Как сделать HTTP-запрос в Java Хочешь забирать данные из API, отправлять JSON, работать с HTTP в Java — и без боли? С Java 11 всё проще, потому что появился HttpClient, который умеет GET, POST, JSON, async — всё, что надо. Вот разбор — пошагово и с примерами 👇 👍Шаг 1: Импорт нужных классов
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
➡️ Всё встроено в java.net.http, ничего не нужно скачивать. 👍 Шаг 2: Создаём клиента
HttpClient client = HttpClient.newHttpClient();
➡️ Это "браузер" внутри Java — он отправляет запросы, ждёт ответы и управляет соединениями. 👍 Шаг 3: Создаём GET-запрос
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.github.com"))
    .build();
➡️ uri() — это URL запроса. Обязательно через URI.create(...). 👍 Шаг 4: Отправляем и получаем ответ
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
➡️ send() — делает синхронный запрос. ➡️ BodyHandlers.ofString() — тело ответа как строка. 👍 Шаг 5: Отправка POST с JSON
String json = """
    {
        "name": "Alice",
        "role": "admin"
    }
    """;

HttpRequest postRequest = HttpRequest.newBuilder()
    .uri(URI.create("https://example.com/api/users"))
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> postResponse = client.send(postRequest, HttpResponse.BodyHandlers.ofString());
System.out.println(postResponse.body());
➡️ Используем .POST() + BodyPublishers.ofString(...) для тела ➡️ Указываем Content-Type, чтобы сервер знал, что это JSON 👍 Шаг 6: Асинхронные запросы
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);
➡️ sendAsync() — не блокирует поток ➡️ Работает с CompletableFuture — можно делать цепочки 👍 Шаг 7: Обработка ошибок
try {
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    if (response.statusCode() == 200) {
        System.out.println("✅ Успех");
    } else {
        System.out.println("❌ Ошибка: " + response.statusCode());
    }
} catch (Exception e) {
    System.out.println("⚠️ Ошибка при запросе: " + e.getMessage());
}
➡️ Не забудь try/catch — HTTP может быть непредсказуемым 🗣️ Запомни: С HttpClient можно делать любые HTTP-запросы прямо из Java-кода. Больше не нужно использовать громоздкий HttpURLConnection или сторонние библиотеки. Всё компактно и читаемо.

👩‍💻 Ищем Java разработчиков. Удалёнка, релокейт платим много! Специально для Вас, собираем лучшие вакансии для Java разрабо
👩‍💻 Ищем Java разработчиков. Удалёнка, релокейт платим много! Специально для Вас, собираем лучшие вакансии для Java разработчиков с прямыми контактами в Telegram на канале @it_match_java Подпишись чтобы не упустить свой шанс получить лучший оффер! ➡️ Посмотреть вакансии

🔥 Почему String в Java — immutable, и как это может неожиданно сломать тебе код? Строки в Java неизменяемы — это значит, что любой метод replace(), substring(), toUpperCase() и даже += не изменяет строку, а создаёт новую. Это кажется удобным... пока ты не врежешься в реальные проблемы. 🟢 Что значит immutable?
String s = "hello";
s.toUpperCase();
System.out.println(s);  // hello ❌
➡️ Ожидал "HELLO"? Не тут-то было. s.toUpperCase() вернул новую строку, но ты её никуда не сохранил. Оригинальная строка осталась неизменной. 🟢 Почему так сделано?
1️⃣. Безопасность Строки используются в ClassLoader, Map, URL, Reflection. Если бы кто-то мог изменить строку "com.mysql.Driver" в рантайме — ты бы загрузил не тот класс.
2️⃣. Хеширование String.hashCode() кешируется. Если строка изменилась бы после попадания в HashMap, ты больше не смог бы её достать по ключу.
3️⃣. Thread Safety Несколько потоков могут использовать одну строку одновременно — без блокировок и синхронизации. Иммутабельность = потокобезопасность.
🧨 Где это реально ломает приложения? 📍 Ошибка 1: сравнение по == вместо equals()
String a = "test";
String b = new String("test");

System.out.println(a == b);       // false ❌
System.out.println(a.equals(b));  // true ✅
➡️ == сравнивает ссылки, а не значения. Даже если строки одинаковые, объект может быть другим. 📍 Ошибка 2: изменение строки в цикле
String s = "";
for (int i = 0; i < 1000; i++) {
    s += i;
}
➡️ Каждое += создаёт новую строку. 1000 операций = 1000 объектов = тормоза. Правильно так:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i);
}
String result = sb.toString();
📍 Ошибка 3: утечка памяти через substring()
String huge = "..." // большой текст
String small = huge.substring(0, 5);
➡️ small держал ссылку на huge — из-за чего вся большая строка не могла быть удалена. Java это исправили, но в старых версиях боль реальна. 🗣️ Запомни: String — это надёжный, безопасный и вечно новый объект. Хочешь модифицировать — используй StringBuilder или StringBuffer. Хочешь сравнить — equals(), не ==.

Канал о полиграфии и типографии Capital Press 📚 Просто о сложном! Всё о производстве полиграфической продукции. 🏠 Показываем печатный процесс в типографии, изготовленные нами издания, изучаем полиграфические термины и многое другое. ⚡ Изготовим любую полиграфию на заказ с учётом всех пожеланий. ✨ Работаем оперативно. Безупречное качество. Переходите на канал, чтобы узнать о нюансах производственного процесса в типографии! Подписаться #реклама О рекламодателе

☕️ eBPF + JVM: мониторинг глубже, чем Prometheus Хотите узнать, что реально происходит в Java‑приложении? eBPF открывает дост
☕️ eBPF + JVM: мониторинг глубже, чем Prometheus Хотите узнать, что реально происходит в Java‑приложении? eBPF открывает доступ к ядру Linux и даёт метрики и трассировку без переписывания кода или агентов. В статье вы найдёте: 📌 Как eBPF и bpftrace помогают следить за GC, аллокациями и CPU 📌 Чем это глубже и точнее, чем обычный мониторинг 📌 Подводные камни и требования Linux 4.4+ 📌 Почему это must‑have для high‑load Java ➡️ Читайте и наслаждайтесь 🗣️JVM больше не чёрный ящик: теперь вы реально видите, что происходит под капотом. 🤩 Java Фишки и трюки || #Cтатья

⌨️ Методы hashCode() и equals() Методы hashCode() и equals() в Java тесно связаны и играют ключевую роль в работе хеш-структур, таких как HashMap, HashSet, Hashtable. 🔹 Метод equals(Object obj) Этот метод определяет логическое равенство объектов. По умолчанию (Object.equals) сравниваются ссылки (то есть ==), но обычно его переопределяют, чтобы сравнивать содержимое объектов. 📜 Контракт equals: 1️⃣ Рефлексивностьx.equals(x) должно быть true. 2️⃣ Симметричностьx.equals(y)y.equals(x). 3️⃣ Транзитивностьx.equals(y) и y.equals(z)x.equals(z). 4️⃣ Согласованность — многократные вызовы x.equals(y) возвращают один и тот же результат, если объекты не меняются. 5️⃣ Сравнение с nullx.equals(null) должно быть false. 🔹 Метод hashCode() Возвращает целое число, которое используется, например, для определения "корзины" (bucket) в хеш-таблицах. 📜 Контракт hashCode: 👍Если x.equals(y) — обязательно x.hashCode() == y.hashCode(). 👍Обратное не обязательно: если x.hashCode() == y.hashCode(), это не значит, что x.equals(y). 🔄 Связь между equals и hashCode: Если вы переопределяете equals(), вы обязательно должны переопределить и hashCode(), иначе, например, объект не будет корректно работать в HashSet или HashMap. ⛔️ Пример ошибки:

Set<Person> people = new HashSet<>();
people.add(new Person("Alice"));
System.out.println(people.contains(new Person("Alice"))); // false, если hashCode не переопределен
Правильный шаблон:

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    if (obj == null || getClass() != obj.getClass()) return false;
    Person person = (Person) obj;
    return name.equals(person.name);
}

@Override
public int hashCode() {
    return Objects.hash(name);
}

⚡️Начинающий в Android-разработке? Хотите создавать кроссплатформенные приложения с минимальными затратами? 15 июля в 20:00 М
⚡️Начинающий в Android-разработке? Хотите создавать кроссплатформенные приложения с минимальными затратами? 15 июля в 20:00 МСК на открытом вебинаре курса «Android Developer» мы создадим простое приложение — игру крестики-нолики, выделим логику в кроссплатформенный модуль и создадим визуальную часть с использованием Compose multiplatform. Этот урок будет полезен тем, кто хочет освоить основы UI-разработки на Android и перейти к созданию кроссплатформенных приложений. Вы поймете, почему выгодно начинать с Android, и как с помощью подхода write once and run anywhere разрабатывать для мобильных устройств и других платформ. 👉Все участники получат скидку на полный курс, зарегистрируйтесь, чтобы не пропустить: https://otus.pw/UnJy/ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

☕️ ООП в Java: как писать поддерживаемый код, а не “инкапсуляция + наследование” Ты не обязан учить ООП по книжке. Но обязан понимать, как структурировать код, чтобы его можно было: 🟢 расширять без боли, 🟢 не дублировать, 🟢 легко тестировать. Вот как это делается в боевом коде 👇 📦 1. Интерфейсы = API, классы = реализация
public interface Storage {
    void save(String data);
}

public class FileStorage implements Storage {
    public void save(String data) {
        // записать в файл
    }
}

public class DBStorage implements Storage {
    public void save(String data) {
        // сохранить в БД
    }
}
➡️ Теперь всё приложение работает с Storage, а не с FileStorage или DBStorage.
public class App {
    private final Storage storage;

    public App(Storage storage) {
        this.storage = storage;
    }

    public void run() {
        storage.save("some data");
    }
}
👍 Меняешь реализацию — ничего не ломается. Архитектура устойчива. 🔄 2. Поведение через композицию, не через наследование
public class Logger {
    public void log(String message) {
        System.out.println("[LOG] " + message);
    }
}

public class UserService {
    private final Logger logger = new Logger();

    public void register(String name) {
        logger.log("Регистрация пользователя " + name);
    }
}
➡️ Вместо extends Logger — просто вставили поведение. Гибче, проще, безопаснее. 🧩 3. Объекты = поведение, а не мешок полей
public class Order {
    private final List<Product> products;

    public Order(List<Product> products) {
        this.products = products;
    }

    public BigDecimal total() {
        return products.stream()
                       .map(Product::price)
                       .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}
➡️ Объект умеет что-то делать, а не просто хранить данные. Это и есть "настоящее ООП". ⚙️ 4. Варианты поведения — через делегаты, не if/else
public interface DiscountPolicy {
    BigDecimal apply(BigDecimal price);
}

public class NoDiscount implements DiscountPolicy {
    public BigDecimal apply(BigDecimal price) {
        return price;
    }
}

public class BlackFridayDiscount implements DiscountPolicy {
    public BigDecimal apply(BigDecimal price) {
        return price.multiply(new BigDecimal("0.7"));
    }
}
public class Checkout {
    private final DiscountPolicy discount;

    public Checkout(DiscountPolicy discount) {
        this.discount = discount;
    }

    public BigDecimal finalPrice(BigDecimal basePrice) {
        return discount.apply(basePrice);
    }
}
➡️ Новый тип скидки? Просто добавь класс. Никаких switch/case/if. 🧠 Реальное ООП — это: 👍 контейнеры поведения с чётким контрактом, 👍 код, который расширяется, а не переписывается, 👍 минимум зависимостей, максимум гибкости, 👍 отделённые обязанности (SRP без декламации). 🗣️ Запомни: ООП в Java — это не “инкапсуляция — наследование — полиморфизм”, а грамотно разложенные по объектам ответственности и поведение. Если твой код не надо переписывать, чтобы добавить новый сценарий — это оно.

Подборка каналов IT от наших друзей: 🎬 https://t.me/videos_it  — Самая большая база видеоуроков по IT в Рунете 🐧 https://t.me/Linux_Club_nomer_1 — Гайды, статьи  и обучающие материалы по Linux. Если хочешь погрузиться в мир Linux, то тебе к нам 📔 https://t.me/Programmirovanie_1 — объёмная библиотека для программистов 🇷🇺 https://t.me/our_computer — От каждого по способностям, каждому по потребностям 🔐 https://t.me/LazySecurity777 — канал по информационной безопасности с разнообразными техническими материалами на разные темы 🤩 https://t.me/iwannabeprogrammer  — здесь вы найдёте лучшие IT-мемы и прекрасно проведёте время 🔥 https://t.me/floppydisky — Юмор для программистов 🦥https://t.me/Lazy_Programmer_channel – подпишись, будем лениться вместе 📱 https://t.me/codebase_frontend —  Все самое интересное и полезное у нас 😎

☕️ Hibernate: ORM без боли Hibernate — это Object-Relational Mapping. Он превращает твои Java-классы в таблицы и наоборот. Без JDBC, без ручных SQL-запросов — читаешь и сохраняешь объекты как есть. 📦 Сущность = таблица
@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Column(name = "email_address")
    private String email;

    // геттеры/сеттеры
}
🟢 @Entity превращает класс в таблицу 🟢 @Id — это первичный ключ 🟢 @Column — имя колонки, если отличается от поля 🔁 Чтение и запись без SQL
User u = new User();
u.setName("Alice");
u.setEmail("a@example.com");

session.save(u);
🟢 Hibernate сам делает INSERT INTO users ... под капотом. 🟢 Объекты = строки в таблице. Не нужно писать SQL — только работать с Java. 🔍 Поиск через HQL (Hibernate Query Language)
List<User> users = session
    .createQuery("from User where email like :e", User.class)
    .setParameter("e", "%@gmail.com")
    .getResultList();
➡️ from User — это не SQL, а HQL. Работает на уровне классов, не таблиц. 🤝 Связи между таблицами
@Entity
public class Order {

    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    private User user;

    private String product;
}
➡️ Один User — много Order. Hibernate сам создаст user_id в таблице заказов.
User u = session.get(User.class, 1L);
List<Order> orders = u.getOrders(); // автоматический join
➡️ Хочешь lazy, eager — всё регулируется аннотациями. 📋 Обновление и удаление
User u = session.get(User.class, 2L);
u.setName("Bob");
session.update(u);
session.delete(u);
➡️ Hibernate сам решает, какие SQL-команды вызвать — ты просто работаешь с объектами. 🔄 Автоматическое создание таблиц
spring.jpa.hibernate.ddl-auto=update
➡️ Таблицы создаются автоматически по твоим сущностям. 🗣️ Запомни: Hibernate — это способ писать код, а не SQL. Он мапит Java-объекты на реляционные таблицы, сам управляет транзакциями, связями, сессиями. Но главное — он не магия, и работает только если ты понимаешь, что под капотом.

👋 Меня зовут Николай, я — техлид в крупном банке Провел более 120 собеседований разработчиков уровня middle+, онбордил 10 специалистов в разных командах И обратил внимание на нехватку экспертизы большинства разработчиков в одних и тех же ключевых технологиях: Spring, PostgreSQL, Kafka, многопоточность, микросервисы, - что приводит их к отказам на собеседованиях и сокращениям на работе На текущий момент, когда рынок на спаде, мне продолжают писать HR’ы по 3 раза в неделю с предложениями вакансий, что говорит о высокой потребности рынка в сильных специалистах Каждый месяц я прохожу собеседования и получаю офферы в крупнейшие компании: Яндекс, Альфу, Тинькофф, Сбер и др. Благодаря чему остаюсь в курсе потребностей рынка, знаю какие вопросы задают и как правильно на них отвечать, чтобы получить заветный оффер 📌 Более года занимаюсь менторингом: — действующих Java разработчиков, кто хочет повысить свою квалификацию — начинающих разработчиков и специалистов смежных специальностей (тестировщиков, аналитиков, специалистов сопровождения), кто имеет опыт самостоятельного обучения и хочет получить реальную практику ⚠️ Людей совсем без опыта не беру На менторинге: - показываю, каким образом ведется разработка реального проекта, провожу ревью вашего кода - расставляю приоритеты в обучении - готовлю к собеседованиям и помогаю составить резюме По окончании курса мы с вами напишем 3 микросервиса и 1 библиотеку (spring boot starter), которые могут вам встретится в реальной работе и станут частью вашего резюме С июня 2024 года обучение прошли 40 учеников, из которых: — 13 человек получили офферы на 100-470 тыс. рублей в месяц — 9 вышли на рынок и находятся в поиске работы — 18 человек остались на тех же местах, кто-то получил повышение, кто-то готовиться к выходу на рынок С некоторыми результатами, отзывами и офферами моих учеников можно ознакомиться по ссылке На потоке вас ждет 35 часов лекций и 30 часов живого разбора вопросов. Кроме того, вы получите доступ к вопросам, которые задавали мне и моим ученикам на реальных собеседованиях Четвертый поток начинается 15 июля, если хотите участвовать — заполните анкету и я с вами свяжусь Блог в телеграм

🔐 Java и Безопасность: как защищают приложения в 2025 году Безопасность давно перестала быть опцией — это must-have. В 2025
🔐 Java и Безопасность: как защищают приложения в 2025 году Безопасность давно перестала быть опцией — это must-have. В 2025 Java предлагает разработчику целый арсенал встроенных решений и новых подходов для защиты своих сервисов. В статье ты узнаешь: 📌 Какие уязвимости до сих пор типичны для Java-приложений и как их избежать. 📌 Как работают современные security-фреймворки: Spring Security, OPA, Keycloak. 📌 Что такое Zero Trust архитектура и как реализовать её на Java. 📌 Почему OAuth 2.1, JWT и mTLS — это уже не “просто мода”, а стандарт де-факто. ➡️ Читайте и наслаждайтесь 🗣️ Вывод: в мире Java безопасность — это уже не боль, а гибкий и удобный инструментарий. Главное — начать использовать правильно. 🤩 Java Фишки и трюки || #Cтатья #JavaSecurity #SpringSecurity #ZeroTrust

🌿 Фишки и тонкости Spring — которые реально нужны в проектах Spring — не только @Autowired и @Controller. Он умеет кэшировать, обрабатывать события, внедрять бин по условию, управлять конфигурацией, проксировать методы и даже сам себя обновлять. Вот то, что ты точно начнёшь использовать в реальных проектах 👇 🔄 @PostConstruct — инициализация после DI
@Component
public class MyService {
    @PostConstruct
    public void init() {
        System.out.println("✅ Всё сконфигурировано, запускаем...");
    }
}
➡️ Метод вызовется сразу после того, как все зависимости внедрены. Не путать с конструктором — в нём ещё может не быть других бинов. 💥 @EventListener — реакция на внутренние события
@Component
public class UserEventHandler {

    @EventListener
    public void onRegistered(UserRegisteredEvent event) {
        System.out.println("🎉 Новый пользователь: " + event.getEmail());
    }
}
// где-то в коде:
applicationEventPublisher.publishEvent(new UserRegisteredEvent(email));
➡️ Это удобнее, чем коллбэки и наблюдатели — разнесённая логика, ничего не жёстко связано. 🧪 Условная загрузка бинов
@Bean
@ConditionalOnProperty(name = "feature.cool", havingValue = "true")
public CoolFeature coolFeature() {
    return new CoolFeature();
}
➡️ Бин создастся только если в `application.properties` прописано `feature.cool=true` ⚙️ @ConfigurationProperties — структурированная конфигурация
@ConfigurationProperties(prefix = "mail")
@Component
public class MailSettings {
    private String host;
    private int port;
    // getters/setters
}
➡️ В application.yml:
mail:
  host: smtp.example.com
  port: 587
📌 И всё это уже лежит в MailSettings бин — без @Value, без хардкода. 🧠 Внедрение значений через @Value
@Value("${app.name:DefaultApp}")
private String appName;
➡️ Подтянет app.name из пропертей. Если не указано — будет "DefaultApp". 📍 Логика до и после вызова метода — через AOP
@Aspect
@Component
public class LogAspect {
    @Around("@annotation(Loggable)")
    public Object log(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("▶️ Вызов: " + pjp.getSignature());
        Object result = pjp.proceed();
        System.out.println("⏹️ Результат: " + result);
        return result;
    }
}
➡️ Работает на любой метод с аннотацией @Loggable. Реальный способ вклиниваться в методы без изменения кода. ⚡️ Кеширование результатов методов
@Cacheable("users")
public User getById(Long id) {
    return userRepository.findById(id).orElseThrow();
}
➡️ При повторных вызовах с тем же id результат будет из кеша. Настраивается в пару строк через @EnableCaching. 🧵 Асинхронные методы без Thread
@Async
public void sendMailAsync(String email) {
    mailSender.send(email);
}
➡️ Метод вызовется в фоне, результат (если Future) можно отследить. Главное — не забыть @EnableAsync. 📦 Создание прототипов: новый бин каждый раз
@Bean
@Scope("prototype")
public Connection tempConnection() {
    return new Connection();
}
➡️ Каждый вызов getBean(Connection.class) даст новый объект, а не singleton. 🔁 Рефреш контекста без перезапуска
@Autowired
private ConfigurableApplicationContext context;

public void reload() {
    context.refresh();
}
➡️ Можно подгрузить новые проперти, обновить бины, не трогая процесс. 🗣️ Запомни: Spring — не фреймворк, это платформа. Настоящая сила — в деталях: события, прокси, AOP, конфигурации, кеш, асинхронность. Чем лучше ты понимаешь эти фишки — тем меньше шаблонного кода и больше магии под контролем.

🧑🏻‍💻Хотите научиться создавать приложения на Android? 9 июля в 20:00 МСК мы разберёмся, как создать простое приложение «Фо
🧑🏻‍💻Хотите научиться создавать приложения на Android? 9 июля в 20:00 МСК мы разберёмся, как создать простое приложение «Фото дня». На открытом вебинаре вы научитесь работать с API, скачивать данные с сервера, отображать фотографии и их описания в приложении, а также писать бизнес-логику для загрузки и отображения информации. Вы освоите ключевые навыки, необходимые начинающему разработчику Android-приложений: подключение к серверу, взаимодействие с API, отображение данных и создание интерфейса. Этот опыт станет основой для вашего пути в мобильной разработке. ⚡️Открытый урок проходит в преддверии старта курса «Android Developer». Все участники получат скидку на обучение. Регистрация открыта: https://otus.pw/MqBi/ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

☕️ ThreadPool в Java: управляем потоками по-взрослому Если тебе нужно запускать задачи параллельно — не создавай 1000 new Thread() руками. ThreadPool даст тебе контроль, переиспользование потоков и экономию ресурсов. 🚀 Простой пул через Executors
ExecutorService pool = Executors.newFixedThreadPool(4);

for (int i = 0; i < 10; i++) {
    int taskId = i;
    pool.submit(() -> {
        System.out.println("🔧 Задача " + taskId + " в потоке " + Thread.currentThread().getName());
    });
}

pool.shutdown();
➡️ Пул из 4 потоков. Все 10 задач выполнятся по очереди, переиспользуя потоки. ➡️ shutdown() завершает работу пула после выполнения задач. ⚖️ Типы пулов
Executors.newFixedThreadPool(4);       // фиксированное количество потоков
Executors.newCachedThreadPool();       // динамически растёт при нагрузке
Executors.newSingleThreadExecutor();   // один поток на всё
🟢 Fixed — стабильный. 🟢 Cached — вспышки нагрузки. 🟢 Single — последовательные задачи. 🧠 Почему не new Thread()?
new Thread(() -> doStuff()).start();  // плохо для большого числа задач
👍 Каждый Thread — это новый объект + ресурсы ОС. 👍 Пулы переиспользуют потоки, управляют ими и не перегружают систему. 🧰 Завершение работы пула
pool.shutdown();                    // мягкое завершение
pool.awaitTermination(10, TimeUnit.SECONDS);

pool.shutdownNow();                 // жёсткая остановка
➡️ Сначала shutdown(), потом awaitTermination() — ждёшь окончания. ➡️ shutdownNow() — кидает InterruptedException в задачи. ⛓️ Callable и Future
ExecutorService pool = Executors.newSingleThreadExecutor();

Callable<String> task = () -> {
    Thread.sleep(1000);
    return "Готово!";
};

Future<String> result = pool.submit(task);

System.out.println(result.get());  // блокирует до результата
pool.shutdown();
➡️ Callable возвращает значение, в отличие от Runnable. ➡️ Future.get() — ждёт выполнения. 🔍 Настройка вручную через ThreadPoolExecutor
ExecutorService pool = new ThreadPoolExecutor(
    2, 4, 60, TimeUnit.SECONDS,
    new LinkedBlockingQueue<>()
);
➡️ Полный контроль: минимальное/максимальное число потоков, очередь, поведение. 🗣️ Запомни: ThreadPool — это не про скорость, а про контроль и стабильность. Не плодишь потоки — а держишь их в узде. Подходит для бэкенда, ботов, парсеров, фоновых задач и всего, что живёт в многопоточке.

🔍 Завтра тестовое собеседование с Java-разработчиком 2 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседов
🔍 Завтра тестовое собеседование с Java-разработчиком 2 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Сергею Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqwwps2P

🌐 Java:Что выбрать — виртуальные потоки или реактивный подход? В 2025 году Java предлагает два мощных и актуальных подхода к
🌐 Java:Что выбрать — виртуальные потоки или реактивный подход? В 2025 году Java предлагает два мощных и актуальных подхода к масштабируемому коду: виртуальные потоки (Project Loom) и реактивное программирование (Project Reactor, RxJava). Какой из них выбрать, зависит от задач, но важно понять различия. В статье ты узнаешь: 📌 Что такое виртуальные потоки и как они упрощают многозадачность, устраняя сложности с потоками ОС. 📌 Когда классический реактивный подход через Flux/Mono оправдан — и где он будет эффективнее. 📌 Конкретные примеры — REST‑сервисы, WebFlux и виртуальные потоки одновременно. 📌 Почему виртуальные потоки могут заменить реактив на большинстве задач, но не всегда. ➡️ Читайте и наслаждайтесь 🗣️ Вывод: Java - это мир гибкого выбора: хочешь простоту и читаемость — бери Loom, нужна экстремальная отказоустойчивость — Reactivity остаётся в деле. 🤩 Java Фишки и трюки || #Cтатья #ProjectLoom #Reactive

Java | Фишки и трюки - Statistics & analytics of Telegram channel @java_tips_and_tricks