java_iibrary | Unsorted

Telegram-канал java_iibrary - Java Portal | Программирование

12073

Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg

Subscribe to a channel

Java Portal | Программирование

SOLID в Java: принцип подстановки Лисков (LSP) утверждает:

==> Объекты базового класса должны заменяться объектами подклассов без проблем.

× Плохой пример

* Есть класс Vehicle с методом startEngine().
* Наследуемся в Bicycle, но… у велосипеда нет двигателя, и метод выбрасывает исключение.

Такая иерархия:

class Vehicle {
public void startEngine() { ... }
}

class Bicycle extends Vehicle {
@Override
public void startEngine() {
throw new UnsupportedOperationException("Bicycles don't have engines!");
}
}


* Любой тест, который ожидает, что любой Vehicle сможет запустить двигатель, падает.
* Подкласс ведёт себя иначе, чем базовый класс — LSP нарушен.

✓ Как исправить

Разделить ответственность через интерфейсы:

interface Vehicle {}

interface Motorized {
void startEngine();
}

class Car implements Vehicle, Motorized {
public void startEngine() { ... }
}

class Bicycle implements Vehicle {
// без двигателя — всё корректно
}


Теперь только те объекты, которым действительно нужен двигатель, реализуют Motorized.

* Подклассы не должны ломать ожидания, заданные базовым классом
* Поведение лучше разделять, чем «затыкать» методы исключениями
* LSP делает код предсказуемым и безопасным для расширения

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Совет по Java: удаляйте неиспользуемые импорты и переменные — это улучшает читаемость кода.

До:

import java.util.Date;   // неиспользуемый импорт
import java.util.Scanner;

public class Greeting {
private int age; // неиспользуемая переменная

public void sayHello() {
Scanner sc = new Scanner(System.in);
System.out.println("Hello, world!");
sc.close();
}
}


После:

import java.util.Scanner;

public class Greeting {

public void sayHello() {
Scanner sc = new Scanner(System.in);
System.out.println("Hello, world!");
sc.close();
}
}


#Java #CleanCode

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Основные области памяти JVM:

▪️Heap (куча)
Общая для потоков
Хранит объекты и экземпляры, управляется сборщиком мусора

▪️Method Area (область методов)
Общая для потоков
Метаданные классов, статические переменные, байткод

▪️Runtime Constant Pool (пул констант времени выполнения)
На класс, разделяется
Строковые литералы, ссылки на методы, константы

▪️JVM Stack (стек JVM)
На поток
Фреймы вызовов, локальные переменные, адреса возврата

▪️Native Stack (нативный стек)
На поток
Выполнение нативного кода через JNI

▪️Program Counter (PC регистр)
На поток
Текущая инструкция, которую выполняет поток

▪️Code Cache (кэш кода)
Общий
Машинный код после JIT-компиляции

▪️Direct Memory (off-heap)
Общая
Память вне кучи для высокопроизводительного ввода-вывода

Разбиение кучи:

▪️Eden
Новые объекты создаются здесь

▪️Survivor
Краткоживущие объекты перед продвижением

▪️Old Generation
Долгоживущие объекты

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: если нужно писать переносы строк, соответствующие ОС, используй System.lineSeparator().


👉 Java Portal

Читать полностью…

Java Portal | Программирование

А что у нас здесь? Новая серия вебинаров по Java!

И первый вебинар от PVS-Studio посвящен современному Gradle для Java-разработчика.

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

А еще:
- в формате лайвкодинга создадите с нуля базовую структуру мультимодульного проекта;

- настроите зависимости между модулями;

- обсудите лучшие практики организации кода;

- после вебинара получите понятную основу для построения поддерживаемых и расширяемых Java-проектов любой сложности.

Подробности и регистрация по ССЫЛКЕ.

Читать полностью…

Java Portal | Программирование

Аккуратная идея из превью JDK 24: JEP 487, Scoped Values.

Scoped Values направлены на то, чтобы сделать общий неизменяемый контекст более предсказуемым по сравнению с ThreadLocal, особенно в современном конкурентном коде.

Небольшой пример 👇

Читать полностью…

Java Portal | Программирование

В Java можно использовать Optional.orElseThrow() для реализации так называемого fail-fast поведения.

✅ Fail-fast означает, что ошибки фиксируются ближе к месту возникновения, за счёт чего стек вызовов проще читать и анализировать
#Java #РазработкаПО

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Совет по Java: можно избежать чрезмерного количества параметров метода, сгруппировав связанные значения в объекты. #Java #РазработкаПО

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Spring Boot: избегай FetchType.EAGER, если в этом нет реальной необходимости.

❌ Пометка связи как EAGER заставляет ORM загружать её при каждой загрузке сущности, независимо от того, вызываешь ли ты метод этой связи на самом деле.
#Springboot #РазработкаПО

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: Если нужно читать небольшие файлы, можно использовать Files.readAllLines() — это более прямой и простой способ.
#SpringBoot #JavaDev

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java Generics — всё, что нужно знать

1. Box<T> → Обобщённый класс
• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).

2. <T> void print(T val) → Обобщённый метод
• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).

3. <T extends Number> → Ограниченный тип
• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).

4. <T extends A & B> → Несколько ограничений
• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).

5. <?> → Неограниченный подстановочный тип
• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).

6. <? extends T> → Верхняя граница подстановочного типа
• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).

7. <? super T> → Нижняя граница подстановочного типа
• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление Integer в List<? super Integer>).

8. Правило PECS
• Producer Extends, Consumer Super.
• Используй extends для чтения, super для записи (например, API-вход против обработки ответа).

9. List list = new ArrayList(); → Сырой тип
• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).

10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать T.class, new T(), или instanceof T (например, нельзя делать проверки или создавать объекты на основе T).

11. Обобщённый конструктор

<T> MyClass(T val) { }

• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).

12. Обобщённый интерфейс
interface Mapper<F, T> { T map(F input); }

• Используй при преобразовании одного типа в другой (например, DTO → сущность).

13. Нельзя использовать примитивы
• Нельзя List<int> — только List<Integer>.
• Используй обёртки (коллекции могут хранить только объекты, не примитивы).

14. Нельзя создавать массивы с обобщением
• new T[] не работает.
• Используй List<T> вместо (например, динамические коллекции).

15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в List<? extends Number>.
• Используй <? super Number>, если нужна вставка (например, для пакетной обработки или модификации коллекции).

👉 Java Portal

Читать полностью…

Java Portal | Программирование

JavaDoc получил реальное улучшение удобства использования в Java 24.

Парень написал практический туториал, который показывает, как использовать JavaDoc с Markdown через комментарии /// в небольшой библиотеке на Maven + JUnit, включая документацию пакетов, записи, запечатанные типы, генерацию JavaDoc и всплывающие подсказки в IDE.

http://buff.ly/RmaVWSt

#Java #Java24 #Javadoc #Maven

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Совет по Java Spring Boot

Если в JSON-запросе приходят лишние поля, приложение может упасть с ошибкой
UnrecognizedPropertyException.

Чтобы этого избежать и не ломать API, добавь аннотацию:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDTO {
private String name;
private int age;
}


👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: используйте WeakHashMap для кэширования, когда ключи без ссылок должны удаляться сборщиком мусора.

❌В HashMap, пока существует сама мапа, ключи и связанные с ними значения не будут удаляться сборщиком мусора.

✅В WeakHashMap ключи хранятся через слабые ссылки, и если на ключ больше нет сильных ссылок в программе, сборщик мусора может его удалить, и он автоматически исчезнет из мапы.

✅Пример:

Map<User, String> map = new WeakHashMap<>();

User u1 = new User("Mick");
map.put(u1, "Cached data");
...
u1 = null;

// С этого момента ключ u1 доступен для сборки мусора.


#Java #JavaDev

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Освой Java с нуля

Этот бесплатный курс охватывает широкий спектр тем, начиная от базовых концепций, таких как переменные, массивы, условные операторы и циклы, до более сложных аспектов, включая ООП, работу с файлами, двумерные массивы и работу с базами данных.

Материалы включают теоретические объяснения, практические примеры кода, и иногда задачи для самостоятельного выполнения

⛓Ссылка: тык

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Spring Boot: можно обрабатывать CORS глобально через WebMvcConfigurer

CORS — это механизм, который позволяет веб-приложению на одном домене (origin) получать доступ к ресурсам с другого домена.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Совет по Java: избегайте глубокой вложенности if-else — используйте guard clauses (ранний выход)

Одна из частых проблем в Java-коде — сильно вложенные условия. Формально код работает, но его сложно читать и поддерживать.

✗ Плохо: вложенные if-else

* сложно читать
* логика размазана
* любое изменение усложняет код

✓ Хорошо: guard clauses (ранний выход)

* проверки сразу отсекают невалидные состояния
* основной сценарий читается сверху вниз
* код короче и понятнее

Почему guard clauses — профессиональный подход:

* снижают когнитивную нагрузку
* делают бизнес-логику очевидной
* упрощают рефакторинг и тестирование
* хорошо сочетаются с fail-fast подходом

Правило простое:
если условие — это ошибка или отклонение от нормального потока, проверяйте его сразу и выходите из метода.

В результате код становится:

* линейным
* предсказуемым
* удобным для поддержки

На уровне синтаксиса это мелочь, но на уровне качества кода разница существенная.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡Spring Boot: задавайте границы @ComponentScan аккуратно, чтобы не сканировать целые пакеты по ошибке.

Предположим, вы используете что-то вроде @ComponentScan("com.mycompany"):

❌Увеличивается время сканирования classpath
❌Замедляется запуск приложения
❌Могут подгружаться классы, не предназначенные быть Spring-компонентами

Лучшие практики:

✅Полагаться на значения по умолчанию:

@SpringBootApplication
public class MyApplication { }


По умолчанию сканируются только подпакеты пакета, где находится MyApplication

✅Сканировать конкретные подпакеты:

@ComponentScan({
"com.mycompany.myapp.product",
"com.mycompany.myapp.order"
})


👉 Java Portal

Читать полностью…

Java Portal | Программирование

Микросервисы — это хаос без этих паттернов

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Совет по Java:

Если нужно посчитать, сколько раз элемент встречается в списке, нет необходимости писать цикл вручную.

Используй готовый метод:
Collections.frequency(...)

Пример:

int count = Collections.frequency(
List.of("red", "green", "red"),
"red"
);
System.out.println(count); // 2


👉 Java Portal

Читать полностью…

Java Portal | Программирование

Polling vs Long Polling vs Webhooks vs SSE

Четыре способа получать обновления от сервера. Каждый даёт свой баланс между простотой, эффективностью и «почти реалтайм» доставкой.

Вот как они отличаются:

— Polling
Клиент каждые несколько секунд отправляет запрос: «есть что-то новое?». Сервер отвечает сразу — независимо от наличия данных. Большинство ответов пустые, что тратит ресурсы клиента и сервера. Подходит для сценариев вроде статуса заказа, где допустима задержка и важна простота реализации.

— Long Polling
Клиент отправляет запрос, а сервер держит HTTP-соединение открытым до появления данных или таймаута. Пустых ответов значительно меньше, чем в обычном polling. Использовался, например, в чатах для приближения к реалтайм-доставке сообщений.

— SSE (Server-Sent Events)
Клиент открывает постоянное HTTP-соединение, сервер стримит события по мере появления. Односторонний канал, лёгкий, работает поверх обычного HTTP. Многие AI-интерфейсы стримят ответы токен за токеном именно через SSE.

— Webhooks
Вместо опроса клиентом, сервис сам отправляет HTTP POST на заранее зарегистрированный callback URL при наступлении события. Stripe использует для подтверждения платежей, GitHub — для событий push. Клиент не держит соединение и не делает запросы, просто принимает вызовы.

Часто используется комбинация: polling для простых статусов, SSE для стриминга, webhooks для событий.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Реальная сила Stream Gatherers в Java 24: кастомная stateful-магия с ранним завершением

Java 24 добавляет Stream Gatherers (JEP 485) — серьёзное расширение Stream API.

Они позволяют создавать кастомные промежуточные операции с поддержкой stateful-преобразований, m-to-n отображений, раннего завершения и параллельного выполнения. В отличие от коллекторов (которые терминальные), Gatherers работают прямо внутри конвейера стримов.

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

С Gatherers код на стримах остаётся ленивым, читаемым, композиционным и переиспользуемым. Теперь Stream API выглядит завершённым для реальных сценариев обработки данных.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Подключения к базе данных — дорогая операция.
Открывать и закрывать их на каждый запрос?
Ещё хуже.

Я нашёл простой разбор того, как на самом деле работает пул соединений и почему это важно.

Ссылка: https://sagarshiroya.dev/posts/database-connection-and-pooling

#Database #SystemDesign

👉 Java Portal

Читать полностью…

Java Portal | Программирование

В Java, если нужно интегрировать полноценного агента, который умеет вызывать инструменты, запускать циклы, хранить контекст и поднимать веб-интерфейс для отладки, не стоит каждый раз собирать это с нуля — здесь уже есть готовый встраиваемый движок.

Встраиваемый движок AI-агента для любого Java-приложения — CLI · REST API · веб Playground

Базовая логика максимально простая: когда модели нужно вызвать инструмент, она выполняет его, записывает результат обратно в контекст и продолжает выполнение. Весь этот цикл упакован в Java-библиотеку и слой приложения на Spring Boot, поэтому его можно напрямую встроить в бизнес-систему или использовать как CLI, REST-сервис или веб Playground.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Для тех кто просил, наш канал с мемами для программистов и айтишников

👇

/channel/+VS5COdLqY_s4OTYy

Читать полностью…

Java Portal | Программирование

Вы предпочитаете аккуратно отформатированные текстовые блоки для аннотаций запросов при использовании Spring Data?

https://spring.io/tools теперь умеет генерировать именно такие при преобразовании AOT-метаданных репозитория в аннотации запросов

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Поставлено в JDK 22: JEP 454 добавил в Java стандартный API для работы с внешними функциями и памятью. Вызов нативного кода больше не обязан начинаться с шаблонного кода JNI. Небольшой пример 👇

Читать полностью…

Java Portal | Программирование

Java-Инженеры, наблюдающие, как все остальные вайбкодят приложения

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Spring Boot: есть возможность использовать стриминг (Stream<T>) для запросов с большими наборами данных.

Результаты подтягиваются чанками, при этом в памяти одновременно находится только небольшая часть данных

В следующем примере есть приложение с CommandLineRunner, которое сохраняет большой набор пользователей в базу данных, а затем обрабатывает данные через стрим:

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@Bean
CommandLineRunner run(UserRepository repo, UserService service) {
return args -> {
// Генерация тестовых данных
for (int i = 1; i <= 10000; i++) {
repo.save(new User("User_" + i));
}

// Обработка через стрим
service.processUsers();
};
}
}


Метод processUsers работает в транзакции и использует метод репозитория streamAllUsers, который возвращает стрим:

@Service
public class UserService {

private final UserRepository repository;

@PersistenceContext
private EntityManager em;

public UserService(UserRepository repository) {
this.repository = repository;
}

@Transactional(readOnly = true)
public void processUsers() {
AtomicInteger counter = new AtomicInteger();

try (Stream<User> stream = repository.streamAllUsers()) {
stream.forEach(user -> {
System.out.println(user.getName());

if (counter.incrementAndGet() % 100 == 0) {
em.clear();
}
});
}
}
}


public interface UserRepository extends JpaRepository<User, Long> {

@Query("SELECT u FROM User u")
Stream<User> streamAllUsers();
}


Важные моменты:

- Нужно использовать транзакцию, иначе соединение может закрыться раньше времени и стрим оборвётся
- Рекомендуется задать размер выборки через spring.jpa.properties.hibernate.jdbc.fetch_size=100, так как некоторые драйверы могут загрузить всё сразу
- Стрим удерживает ресурсы базы данных, его обязательно нужно закрывать (через try-блок, как в примере)

#SpringBoot #JavaDev

👉 Java Portal

Читать полностью…

Java Portal | Программирование

🔴 Завтра тестовое собеседование с Java-разработчиком

15 апреля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир →
@shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…
Subscribe to a channel