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

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

Відкрити в Telegram

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

Показати більше
6 953
Підписники
-324 години
-27 днів
+630 день
Архів дописів
⌨️ Что же это такое Records и sealed classes? 🔹Комбинация records и sealed classes позволяет создавать строгие и безопасные модели данных с ограничениями на наследование. Это особенно полезно при реализации доменных моделей. Records, введенные в Java 14, предоставляют лаконичный способ создания неизменяемых классов данных. Sealed classes, появившиеся в Java 17, позволяют ограничивать наследование. 🫥 Пример реализации системы управления платежами:

public sealed interface PaymentMethod permits CreditCard, BankTransfer, PayPal {
    boolean isValid();
    void process();
}

public record CreditCard(String cardNumber, String expiryDate, String cvv) implements PaymentMethod {
    @Override
    public boolean isValid() {
        return cardNumber != null && cardNumber.length() == 16 
               && expiryDate != null && cvv != null;
    }
    
    @Override
    public void process() {
        System.out.println("Processing credit card payment");
    }
}

public record BankTransfer(String accountNumber, String bankCode) implements PaymentMethod {
    @Override
    public boolean isValid() {
        return accountNumber != null && bankCode != null;
    }
    
    @Override
    public void process() {
        System.out.println("Processing bank transfer");
    }
}

public record PayPal(String email) implements PaymentMethod {
    @Override
    public boolean isValid() {
        return email != null && email.contains("@");
    }
    
    @Override
    public void process() {
        System.out.println("Processing PayPal payment");
    }
}

public record Payment(UUID id, BigDecimal amount, PaymentMethod method) {
    public boolean processPayment() {
        if (method.isValid()) {
            method.process();
            return true;
        }
        return false;
    }
}
Преимущества: 1. Типобезопасность: Компилятор гарантирует, что только определенные классы могут реализовывать PaymentMethod. 2. Неизменяемость: Records обеспечивают неизменяемость данных. 3. Краткость кода: Records автоматически генерируют методы. Пример использования:

public void handlePayment(Payment payment) {
    if (payment.processPayment()) {
        switch (payment.method()) {
            case CreditCard cc -> handleCreditCardPayment(cc);
            case BankTransfer bt -> handleBankTransferPayment(bt);
            case PayPal pp -> handlePayPalPayment(pp);
        }
    } else {
        handleFailedPayment(payment);
    }
}
Этот подход особенно полезен для моделирования бизнес-доменов и реализации паттерна "Состояние". Он позволяет создавать более безопасный и поддерживаемый код.

Эффективная разработка на Spring Boot без ограничений. Пока зарубежные компании отзывают лицензии у пользователей РФ, Amplico
Эффективная разработка на Spring Boot без ограничений. Пока зарубежные компании отзывают лицензии у пользователей РФ, Amplicode продолжает помогать максимально удобно работать со Spring Boot, JPA, Docker, Kafka, Liquibase, MapStruct и т.д. Amplicode можно установить как плагин в IntelliJ IDEA Community и Ultimate, а также в Giga IDE. Что умеет Amplicode? ⚡ Легкая навигация по проекту   ⚡ Создание объектов сразу в терминах фреймворка: контроллеры, репозитории, сервисы, сущности, события, DTO, мапперы и т.д. ⚡ Палитра и инспектор, позволяющие видеть опции, доступные разработчику в текущем контексте ⚡ Умные инжекции, подсказки и исправление ошибок ⚡ и многое другое! А самое главное, Amplicode доступен бесплатно и без региональных ограничений! Познакомьтесь со всеми возможностями Amplicode Читайте наш гайд: «Как превратить IntelliJ IDEA Community Edition в Ultimate за 3 простых шага» #реклама О рекламодателе

👀Как применить Valhalla? ❗️Проект Valhalla: будущее Java с инлайн-классами ❇️Инлайн-классы (или value-классы) представляют собой ключевую часть проекта Valhalla, который значительно изменяет подход к организации данных в Java. Основная идея заключается в объединении производительности примитивов с гибкостью объектов, что позволяет создавать легковесные структуры данных без накладных расходов на размещение в куче. 👾Основные особенности инлайн-классов: 1. ❌Отсутствие идентичности объекта. Инлайн-классы не имеют ссылочной идентичности, то есть сравнение через оператор "==" проверяет содержимое, а не ссылки. 2. 🟢Плоская структура памяти. Данные хранятся компактно, без указателей, что улучшает производительность за счет кэширования. 3. 🔹Zero-Cost Abstraction. Использование инлайн-классов не добавляет накладных расходов по сравнению с примитивами. Пример использования инлайн-класса: Рассмотрим класс Point,который представляет координаты на плоскости:

public primitive class Point {
    private final int x;  
    private final int y;  

    public Point(int x, int y) {  
        this.x = x;  
        this.y = y;  
    }  

    public int getX() {  
        return x;  
    }  

    public int getY() {  
        return y;  
    }  
} 
Ключевое слово primitive указывает, что это инлайн-класс. Его экземпляры хранятся как примитивы, без заголовков и указателей. ✅Преимущества инлайн-классов: 1.💠 Улучшенная производительность массивов. Массив Point[] будет хранить данные в плоском виде, а не как массив ссылок на объекты. 2.📉 Снижение накладных расходов на сборку мусора. Инлайн-объекты не требуют частого вмешательства сборщика мусора (GC). 3. 🛡Оптимизация локальности данных. Данные хранятся компактно, что уменьшает количество промахов кэша. Пример работы с массивом:

Point[] points = new Point[100];
for (int i = 0; i < points.length; i++) {  
    points[i] = new Point(i, i * 2);  
}  
System.out.println(points[50].getX()); // 50
В данном случае массив points занимает меньше памяти и обрабатывается быстрее по сравнению с обычными объектами. 🚫Ограничения инлайн-классов: 1.❇️ Инлайн-классы неизменяемы, все поля должны быть final. 2.❌ Они не могут содержать ссылочные циклы, например, ссылки на самих себя или другие объекты с циклическими зависимостями. 3. 💤В настоящее время находятся в экспериментальной стадии начиная с Java 19.

⚡️ JSON в Java (Jackson vs Gson vs JSON-B) Работа с JSON – частая задача, но Jackson, Gson и JSON-B работают по-разному. Какой выбрать? ⚙️ Скорость сериализации (от самого быстрого): Jackson – самый быстрый (использует ByteBuffer). Gson – медленнее, так как использует Reflection. JSON-B – стандартный API, но проигрывает по производительности. ✔️ Пример с использованием Jackson:

ObjectMapper objectMapper = new ObjectMapper();
        
// Объект → JSON (сериализация)
Person person = new Person("Alice", 30);
String json = objectMapper.writeValueAsString(person);
System.out.println("Jackson Serialized: " + json);
        
// JSON → Объект (десериализация)
Person deserialized = objectMapper.readValue(json, Person.class);
System.out.println("Jackson Deserialized: " + deserialized.name + ", " + deserialized.age);
✔️ Пример с использованием Gson:

Gson gson = new Gson();

// Объект → JSON (сериализация)
Person person = new Person("Bob", 25);
String json = gson.toJson(person);
System.out.println("Gson Serialized: " + json);

// JSON → Объект (десериализация)
Person deserialized = gson.fromJson(json, Person.class);
System.out.println("Gson Deserialized: " + deserialized.name + ", " + deserialized.age);
✔️ Пример с использованием JSON-B:

Jsonb jsonb = JsonbBuilder.create();

// Объект → JSON (сериализация)
Person person = new Person("Charlie", 35);
String json = jsonb.toJson(person);
System.out.println("JSON-B Serialized: " + json);

// JSON → Объект (десериализация)
Person deserialized = jsonb.fromJson(json, Person.class);
System.out.println("JSON-B Deserialized: " + deserialized.name + ", " + deserialized.age);
💡 Совет: Используйте Jackson для high-performance API, но если важен стандарт – выбирайте JSON-B. #java #json #jackson #performance

Онлайн-интенсив для ИТ-специалистов в Открытых школах Т1 Открытые школы — это возможность за месяц прокачать свои навыки и получить оффер в ИТ-холдинг Т1. С тебя — год опыта работы в ИТ, с нас — бесплатный онлайн-интенсив и топовые преподаватели. Что ты получишь? ✅ Уникальный рыночный опыт. Наши проекты ежегодно получают награды на ИТ-конкурсах: Global CIO, Национальной банковской премии и др. ✅ Быстрый рост в ИТ при экспертной поддержке. ✅ Материалы от HR, которые помогут прокачать резюме и подготовиться к интервью в Т1. ✅ Поддержка опытных преподавателей и уникальный карьерный фаст-трек до мидла в Т1 для выпускников интенсива. ✅ Реальный шанс получить оффер в Т1. Подавай заявку до 14 марта и приходи учиться! Старт ИТ-интенсива уже 17 марта. Подать заявку #реклама 16+ t1.ru О рекламодателе

⌨️ О чем говорит ключевое слово final? Модификатор final может применяться к переменным, параметрам методов, полям и методам класса или самим классам. ✔️ Класс не может иметь наследников; ✔️ Метод не может быть переопределен в классах наследниках; ✔️ Поле не может изменить свое значение после инициализации; ✔️ Параметры методов не могут изменять своё значение внутри метода; ✔️ Локальные переменные не могут быть изменены после присвоения им значения. #java #final

— «ИИ заменит программистов» — «Без вышки в IT делать нечего» — «IT - это пузырь» Все слышали эти фразы? Спешу расстроить — э
«ИИ заменит программистов» — «Без вышки в IT делать нечего» — «IT - это пузырь» Все слышали эти фразы? Спешу расстроить — это пи*$@ж! Айтишник из «VISION» убивает стереотипы и даёт самую нужную информацию для входа в айти. Никакой воды, всё по делу, остаётся только выбрать нужное направление: Backend (Python, Java, C/C++, C#, Go, SQL)Frontend (JavaScript, HTML, CSS, React, Vue.js)ИБ & Хакинг, DevOps, Data Science, ML Самобытно и с юмором о программировании — https://t.me/+zSOr3Ob0Z8w3ZjAx

🚀 ZGC vs G1GC – какой GC лучше? В Java 17 появился ZGC – он обещает минимальную задержку. Но лучше ли он G1GC? ✔️ Сравнение:
+------+----------+-----------+----------+
| GC   | Паузы    | Поддержка | CPU      |
|      |          | хипа      | нагрузка |
+------+----------+-----------+----------+
| G1GC | До 200ms | До 16ТБ   | Средняя  |
| ZGC  | <10ms    | До 16ТБ   | Низкая   |
+------+----------+-----------+----------+
📌 Как включить?
-XX:+UseZGC
💡 Совет: ZGC идеально подходит для low-latency приложений, но G1GC лучше сбалансирован для большинства случаев. #java #gc #performance

🔄 StructuredTaskScope — это класс, появившийся в Java 21 в рамках проекта Loom, который помогает управлять группами фоновых задач в многопоточной среде. Он предоставляет удобный механизм для управления задачами в рамках структурированного параллелизма (Structured Concurrency). 📌 Для чего нужен StructuredTaskScope? 🟢Управление жизненным циклом нескольких задач в пределах одного контекста. 🟢Упрощение обработки исключений и отмены всех задач при сбое одной из них. 🟢Автоматическое ожидание завершения всех задач. 🟢Оптимизация работы с виртуальными потоками (Virtual Threads), повышая эффективность работы. ✔️ Преимущества StructuredTaskScope 🟢Простота кода – избавляет от ручного управления Future, CompletableFuture и ExecutorService. 🟢Безопасность – если одна задача падает, можно отменить другие. 🟢Эффективность – интеграция с виртуальными потоками позволяет выполнять множество задач с минимальными накладными расходами. ➡️ Пример:

import java.util.concurrent.*;

public class StructuredTaskScopeExample {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
            // Запускаем две параллельные задачи
            var task1 = scope.fork(() -> fetchDataFromAPI("API 1"));
            var task2 = scope.fork(() -> fetchDataFromAPI("API 2"));

            // Дожидаемся завершения (или отмены в случае ошибки)
            scope.join();
            scope.throwIfFailed(); // Выбросит исключение, если одна из задач завершилась с ошибкой

            // Получаем результаты
            String result1 = task1.get();
            String result2 = task2.get();

            System.out.println("Result 1: " + result1);
            System.out.println("Result 2: " + result2);
        }
    }

    private static String fetchDataFromAPI(String apiName) throws InterruptedException {
        Thread.sleep(1000); // Имитация задержки запроса
        if (Math.random() > 0.8) throw new RuntimeException(apiName + " failed!"); // Имитация ошибки
        return apiName + " response";
    }
}
#java #concurrency #structuredconcurrency

Java + QA = 👉👉👉 QA.GURU 5 лет назад мы сложили тестирование и Джава, став самым крупным сообществом QA Automation инженеро
Java + QA = 👉👉👉 QA.GURU 5 лет назад мы сложили тестирование и Джава, став самым крупным сообществом QA Automation инженеров. И выпустили уже около двух тысяч джавистов. В сообществе школы мы обсуждаем вызовы QA: инженеры разного уровня помогают друг другу. А еще постим много полезного контента: архитектура, автоматизация, работа с базами данных, REST, gRPC, GraphQL и не только. 👉 Сохрани ссылку на @qa_guru_chat 👉 Сохрани ссылку на @qa_guru_chat 👉 Сохрани ссылку на @qa_guru_chat И не пропусти ближайший открытый вебинар по Java Advanced.

🔍 JVM Warm-up – почему Java работает медленно при старте? ➡️ Проблема: JVM использует JIT-компилятор, но оптимизация занимает время. Это приводит к медленному запуску. 📌 Решение 1: предварительная компиляция (AOT, GraalVM)

jaotc --output=app.aot MyApp.class
java -XX:AOTLibrary=app.aot MyApp
📌 Решение 2: заранее прогревать код

for (int i = 0; i < 10000; i++) {
    someMethod(); // Прогреваем JIT-компилятор
}
#java #jvm #performance

В канале Selectel Newsfeed новые бесплатные курсы! Наши бесплатные курсы для специалистов всех уровней помогут разобраться в
+5
В канале Selectel Newsfeed новые бесплатные курсы! Наши бесплатные курсы для специалистов всех уровней помогут разобраться в темах быстро, структурно и последовательно. Вступайте в сообщество IT-специалистов в Telegram от Selectel и развивайте новые навыки📚 Смотреть #реклама 16+ О рекламодателе

❓ Хотите писать смарт-контракты, но кажется, что для этого нужны танцы с бубном? 🫣 Solidity пугает, инструменты кажутся слож
❓ Хотите писать смарт-контракты, но кажется, что для этого нужны танцы с бубном? 🫣 Solidity пугает, инструменты кажутся сложными, а блокчейн — вообще отдельной вселенной. Но на самом деле разработка для EVM не так далека от классического программирования. Главное — разобраться с инструментами и подходами. 👉 Изучим это на открытом уроке «Обзор инструментов и методик» 11 марта в 20:00 (мск): - Какие языки используют для блокчейн-разработки и чем они отличаются - Как работают компиляторы и анализаторы кода для Solidity - На что обращать внимание при написании смарт-контрактов Блокчейн-рынок растёт, и специалисты по Solidity востребованы уже сегодня. Начните разбираться в EVM, пока другие только задаются вопросом «А что это такое?». Все участники получат скидку на большое обучение «Solidity Developer». 👉 Регистрируйтесь и заходите в Web3 осознанно: https://otus.pw/W8gk/ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🔥 java.lang.Record vs Lombok @Value – что лучше? Многие используют Lombok для DTO, но с Java 14 появился record. Стоит ли переходить? 🤔 Чем record лучше Lombok? 🟢 Автоматически создаёт toString(), equals(), hashCode(). 🟢 Immutable без аннотаций. 🟢 Улучшенная поддержка в JVM и JIT. 📌 Сравнение синтаксиса:

// Java Record
public record User(String name, int age) {}

// Lombok
@Value
public class User {
    String name;
    int age;
}
💡 Совет: Используйте record, если вам не нужен полный функционал Lombok – код будет чище. #java #record #lombok #bestpractices

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

🛠 Object.finalize() устарел! Как правильно освобождать ресурсы? Метод finalize() объявлен устаревшим в Java 9 и удалён в Java 18, так как он ненадёжный и медленный. 📌 Как освобождать ресурсы правильно? 🟢 Используйте try-with-resources для Closeable объектов:
try (FileInputStream fis = new FileInputStream("file.txt")) {
    // Работа с файлом
}
🟢 Для кастомных классов используйте AutoCloseable:
class MyResource implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("Ресурс закрыт");
    }
}
💡 Совет: Если ваш объект использует ресурсы (файлы, сокеты, соединения) – реализуйте AutoCloseable. #java #finalize #autocloseable

👺 Программирование — В С Ё В 2025 году на кодинге уже не вывезешь, перспектива года - Информационная Безопасность. Ловите по
👺 Программирование — В С Ё В 2025 году на кодинге уже не вывезешь, перспектива года - Информационная Безопасность. Ловите полезные каналы, которые помогут ворваться в новое направление. ⚡ Пакет Безопаности — Авторский канал матёрого кибербезопасника 😈 Культ Безопаности — Свежие новости из мира ИБ с остринкой 🧠 Пакет Знаний — Инструменты и гайды для кибербезопасников 👨‍🏫 Менторство ИБ — Вкатываемся в кибербез с двух ног 📂 Вступай и изучай новое направление!

⚙️ Compact Strings – как Java экономит память на строках? В Java 9 появилась Compact Strings, уменьшающая использование памяти на 30-40%. ✔️ Как это работает? 🟢 До Java 9 каждая String хранила char[], занимающий 2 байта на символ. 🟢 В Java 9+ String хранит byte[], если все символы – ASCII. 📌 Как включить/выключить?
-XX:+CompactStrings // Включить (по умолчанию)
-XX:-CompactStrings // Выключить
💡 Совет: Если работаете с огромным количеством строк (логирование, JSON), Compact Strings может существенно снизить нагрузку на память. #java #strings #memoryoptimization

Для тех кто просил, наш канал с мемами для программистов и айтишников 👇🏻 https://t.me/+HfhWYqpIgz01ODNi

⌨️ Полезные методы Collections 1️⃣ Collections.min() и Collections.max()

List<Integer> list = Arrays.asList(10, 5, 30, 7);
System.out.println(Collections.min(list)); // 5
System.out.println(Collections.max(list)); // 30
2️⃣ Collections.fill() — заполнение списка одним значением

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Collections.fill(list, "X");
System.out.println(list); // [X, X, X]
3️⃣ Collections.replaceAll() — замена значений

List<String> list = new ArrayList<>(Arrays.asList("яблоко", "груша", "яблоко"));
Collections.replaceAll(list, "яблоко", "банан");
System.out.println(list); // [банан, груша, банан]
4️⃣ Collections.frequency() — подсчет вхождений элемента

List<String> list = Arrays.asList("A", "B", "A", "C", "A");
int count = Collections.frequency(list, "A");
System.out.println(count); // 3
#java #Collections #min #max #fill #replaceAll #frequency

Java | Фишки и трюки - Статистика та аналітика Telegram каналу @java_tips_and_tricks