Java | Фишки и трюки
الذهاب إلى القناة على Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
إظهار المزيد6 953
المشتركون
-324 ساعات
-27 أيام
+630 أيام
أرشيف المشاركات
6 953
✈️ Профессиональное тестирование для IT-бизнеса – скидка 50% на пилотный проект! Глубокая экспертиза в QA на Java.
Устали от задержек релизов и позднего обнаружения багов? Мы знаем, как ускорить разработку в рамках бюджета.
Кто мы?
Команда QA-экспертов, на рынке с 2009 года. Успешно протестировали 530+ проектов для IT-компаний в разных сферах.
Предлагаем комплексное тестирование на максималках: сайтов, приложений, ПО.☝Мы помогаем сохранять компаниям конкретные ресурсы: время и деньги.
Вот реальные результаты:
🤑 28 млн рублей экономии для e-commerce платформы перед Чёрной пятницей;
🤑 9 млн рублей сохранено крупному холдингу при оценке ERP-системы перед приёмкой у китайского разработчика;
🤑 25% сокращения затрат на разработку для fintech-стартапа.
Запишитесь на пилотный проект со скидкой 50%. Протестируем ваш продукт 1-2 недели и предоставим полный отчёт о найденных дефектах, документацию и рекомендации.
➡️Заходите в наш телеграм-бот прямо сейчас, пока есть слоты на выгодный пилот. А ещё в боте можно скачать полезные гайды, в том числе и для джавистов, заходите!
#реклама
О рекламодателе
erid: 2W5zFHyxahv
6 953
☕️ Что такое 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 — это не магия, а компиляция. Он просто пишет за тебя шаблонный код.6 953
🔥 Самые нужные каналы для Java разработчика, чтобы расти в доходе 💸
• Java | Вопросы собесов
• Java | Вакансии с удаленкой
• Java | LeetCode
• Java | Тесты
Подпишись, чтобы не потерять ☝️
6 953
🌐 Как сделать 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 или сторонние библиотеки. Всё компактно и читаемо.6 953
👩💻 Ищем Java разработчиков. Удалёнка, релокейт платим много!
Специально для Вас, собираем лучшие вакансии для Java разработчиков с прямыми контактами в Telegram на канале @it_match_java
Подпишись чтобы не упустить свой шанс получить лучший оффер!
➡️ Посмотреть вакансии
6 953
🔥 Почему 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(), не ==.6 953
Канал о полиграфии и типографии Capital Press
📚 Просто о сложном! Всё о производстве полиграфической продукции.
🏠 Показываем печатный процесс в типографии, изготовленные нами издания, изучаем полиграфические термины и многое другое.
⚡ Изготовим любую полиграфию на заказ с учётом всех пожеланий.
✨ Работаем оперативно. Безупречное качество.
Переходите на канал, чтобы узнать о нюансах производственного процесса в типографии!
Подписаться
#реклама
О рекламодателе
6 953
☕️ eBPF + JVM: мониторинг глубже, чем Prometheus
Хотите узнать, что реально происходит в Java‑приложении? eBPF открывает доступ к ядру Linux и даёт метрики и трассировку без переписывания кода или агентов.
В статье вы найдёте:
📌 Как eBPF и bpftrace помогают следить за GC, аллокациями и CPU
📌 Чем это глубже и точнее, чем обычный мониторинг
📌 Подводные камни и требования Linux 4.4+
📌 Почему это must‑have для high‑load Java
➡️ Читайте и наслаждайтесь
🗣️JVM больше не чёрный ящик: теперь вы реально видите, что происходит под капотом.
🤩 Java Фишки и трюки || #Cтатья
6 953
⌨️ Методы 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️⃣ Сравнение с null — x.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);
}6 953
⚡️Начинающий в Android-разработке? Хотите создавать кроссплатформенные приложения с минимальными затратами?
15 июля в 20:00 МСК на открытом вебинаре курса «Android Developer» мы создадим простое приложение — игру крестики-нолики, выделим логику в кроссплатформенный модуль и создадим визуальную часть с использованием Compose multiplatform.
Этот урок будет полезен тем, кто хочет освоить основы UI-разработки на Android и перейти к созданию кроссплатформенных приложений. Вы поймете, почему выгодно начинать с Android, и как с помощью подхода write once and run anywhere разрабатывать для мобильных устройств и других платформ.
👉Все участники получат скидку на полный курс, зарегистрируйтесь, чтобы не пропустить: https://otus.pw/UnJy/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
6 953
☕️ ООП в 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 — это не “инкапсуляция — наследование — полиморфизм”, а грамотно разложенные по объектам ответственности и поведение.
Если твой код не надо переписывать, чтобы добавить новый сценарий — это оно.6 953
Repost from Вайб-программирование
Подборка каналов 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 — Все самое интересное и полезное у нас 😎
6 953
☕️ 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-объекты на реляционные таблицы, сам управляет транзакциями, связями, сессиями.
Но главное — он не магия, и работает только если ты понимаешь, что под капотом.6 953
👋 Меня зовут Николай, я — техлид в крупном банке Провел более 120 собеседований разработчиков уровня middle+, онбордил 10 специалистов в разных командах И обратил внимание на нехватку экспертизы большинства разработчиков в одних и тех же ключевых технологиях: Spring, PostgreSQL, Kafka, многопоточность, микросервисы, - что приводит их к отказам на собеседованиях и сокращениям на работе На текущий момент, когда рынок на спаде, мне продолжают писать HR’ы по 3 раза в неделю с предложениями вакансий, что говорит о высокой потребности рынка в сильных специалистах Каждый месяц я прохожу собеседования и получаю офферы в крупнейшие компании: Яндекс, Альфу, Тинькофф, Сбер и др. Благодаря чему остаюсь в курсе потребностей рынка, знаю какие вопросы задают и как правильно на них отвечать, чтобы получить заветный оффер 📌 Более года занимаюсь менторингом: — действующих Java разработчиков, кто хочет повысить свою квалификацию — начинающих разработчиков и специалистов смежных специальностей (тестировщиков, аналитиков, специалистов сопровождения), кто имеет опыт самостоятельного обучения и хочет получить реальную практику ⚠️ Людей совсем без опыта не беру На менторинге: - показываю, каким образом ведется разработка реального проекта, провожу ревью вашего кода - расставляю приоритеты в обучении - готовлю к собеседованиям и помогаю составить резюме По окончании курса мы с вами напишем 3 микросервиса и 1 библиотеку (spring boot starter), которые могут вам встретится в реальной работе и станут частью вашего резюме С июня 2024 года обучение прошли 40 учеников, из которых: — 13 человек получили офферы на 100-470 тыс. рублей в месяц — 9 вышли на рынок и находятся в поиске работы — 18 человек остались на тех же местах, кто-то получил повышение, кто-то готовиться к выходу на рынок С некоторыми результатами, отзывами и офферами моих учеников можно ознакомиться по ссылке На потоке вас ждет 35 часов лекций и 30 часов живого разбора вопросов. Кроме того, вы получите доступ к вопросам, которые задавали мне и моим ученикам на реальных собеседованиях Четвертый поток начинается 15 июля, если хотите участвовать — заполните анкету и я с вами свяжусь Блог в телеграм
6 953
🔐 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
6 953
🌿 Фишки и тонкости 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, конфигурации, кеш, асинхронность.
Чем лучше ты понимаешь эти фишки — тем меньше шаблонного кода и больше магии под контролем.6 953
🧑🏻💻Хотите научиться создавать приложения на Android?
9 июля в 20:00 МСК мы разберёмся, как создать простое приложение «Фото дня». На открытом вебинаре вы научитесь работать с API, скачивать данные с сервера, отображать фотографии и их описания в приложении, а также писать бизнес-логику для загрузки и отображения информации.
Вы освоите ключевые навыки, необходимые начинающему разработчику Android-приложений: подключение к серверу, взаимодействие с API, отображение данных и создание интерфейса. Этот опыт станет основой для вашего пути в мобильной разработке.
⚡️Открытый урок проходит в преддверии старта курса «Android Developer». Все участники получат скидку на обучение. Регистрация открыта: https://otus.pw/MqBi/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
6 953
☕️ 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 — это не про скорость, а про контроль и стабильность. Не плодишь потоки — а держишь их в узде. Подходит для бэкенда, ботов, парсеров, фоновых задач и всего, что живёт в многопоточке.6 953
🔍 Завтра тестовое собеседование с Java-разработчиком
2 июля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqwwps2P
6 953
🌐 Java:Что выбрать — виртуальные потоки или реактивный подход?
В 2025 году Java предлагает два мощных и актуальных подхода к масштабируемому коду: виртуальные потоки (Project Loom) и реактивное программирование (Project Reactor, RxJava). Какой из них выбрать, зависит от задач, но важно понять различия.
В статье ты узнаешь:
📌 Что такое виртуальные потоки и как они упрощают многозадачность, устраняя сложности с потоками ОС.
📌 Когда классический реактивный подход через Flux/Mono оправдан — и где он будет эффективнее.
📌 Конкретные примеры — REST‑сервисы, WebFlux и виртуальные потоки одновременно.
📌 Почему виртуальные потоки могут заменить реактив на большинстве задач, но не всегда.
➡️ Читайте и наслаждайтесь
🗣️ Вывод: Java - это мир гибкого выбора: хочешь простоту и читаемость — бери Loom, нужна экстремальная отказоустойчивость — Reactivity остаётся в деле.
🤩 Java Фишки и трюки || #Cтатья #ProjectLoom #Reactive
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
