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

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

@java_iibrary

Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Subscribers
11.6K
Photos
1.6K
Videos
118
Links
1.6K

Showing posts older than #1466 · Back to latest

Older Posts 17 shown
Post #1465 2.29K
Хотите добавить динамическое поведение в ваши Java-классы?

Используйте библиотеку Java Class Extension Library для добавления динамических операций к существующим классам или для предоставления реализаций интерфейсов "на лету"

Кстати, теперь эта библиотека включает новый механизм circuit breaker (автоматическое прерывание цепочки вызовов)

Это позволяет легко добавить функциональность circuit breaker к любой из ваших операций — без изменений в исходном коде 😨

👉 Java Portal
  • ❤ 4
  • 🤔 4
Post #1464 2.27K
Указание типа после ключевого слова new — это действительно допустимая конструкция в Java.

Об этом и многом другом — в видео

👉 Java Portal
  • 🔥 5
  • ❤ 3
Post #1463 2.5K
Дженерики в Java (2004) изменили всё.

Типобезопасность + гибкость.

Сначала вызывали сомнения, теперь — основа коллекций и API.

import java.util.*;

public class GenericsEvolutionDemo {


// До дженериков: отсутствие типобезопасности

    static void withoutGenerics() {
System.out.println("=== Без дженериков ===");
List list = new ArrayList(); // необобщённый тип (raw type)
list.add("Ayush");
list.add(42); // Ошибка не возникает на этапе компиляции

for (Object obj : list) {
try {
String name = (String) obj; // Исключение ClassCastException во время выполнения
System.out.println(name);
} catch (ClassCastException e) {
System.out.println("Поймана ошибка: " + e);
}
}
}


// С дженериками: типобезопасно и понятно

    static void withGenerics() {
System.out.println("\n=== С дженериками ===");
List<String> list = new ArrayList<>();
list.add("Ayush");
// list.add(42); // Раскомментировать эту строку вызовет ошибку компиляции

for (String name : list) {
System.out.println(name.toUpperCase());
}
}


// Пример из реального API: Optional<T>

    static void optionalExample() {
System.out.println("\n=== Пример Optional<T> ===");
Optional<String> maybeName = Optional.of("Ayush");
maybeName.ifPresent(name -> System.out.println("Hello, " + name));
}

public static void main(String[] args) {
withoutGenerics();
withGenerics();
optionalExample();
}
}


👉 Java Portal
  • 👍 7
  • ❤ 5
Post #1461 2.36K
Тема для освоения программирования на java

👉 Java Portal
  • ❤ 7
  • 👍 5
Post #1459 2.09K
Java API Tip

Безопасное приведение long к int

Используй Math.toIntExact() — этот метод возвращает значение long, но выбрасывает ArithmeticException, если оно не помещается в int

Без него преобразование произойдёт молча — и ты можешь получить некорректный результат без всяких ошибок.

Используй toIntExact, когда важно контролировать переполнение

👉 Java Portal
  • ❤ 7
  • 👍 3
Post #1453 2.22K
HTTP-концепции, которые должен знать каждый разработчик

> HTTP-методы — Определяют действие: GET (получить), POST (создать), PUT (заменить), PATCH (обновить), DELETE (удалить).

> Коды статуса — Сообщают, что произошло: 2xx (успех), 4xx (ошибка клиента), 5xx (ошибка сервера).

> Заголовки — Пары ключ-значение, которые передают метаинформацию (например, Content-Type, Authorization, Cache-Control).

> Тело запроса — Фактические данные, отправляемые в POST/PUT/PATCH-запросах (часто в формате JSON или form-data).

> Параметры запроса — Пары ключ-значение в URL после ?, используются для фильтрации, сортировки, поиска.

> Параметры пути — Динамические части URL (например, /user/:id), используются для идентификации ресурсов.

> Идемпотентность — Повтор одного и того же запроса (например, PUT или DELETE) приводит к одному и тому же результату.

> Безопасные методы — Методы, такие как GET и HEAD, которые не должны изменять состояние сервера.

> HTTP/1.1 vs HTTP/2 vs HTTP/3 — Новые версии ускоряют работу за счёт мультиплексирования, бинарных фреймов и протокола QUIC.

> Keep-Alive — Повторное использование TCP-соединений для нескольких запросов для снижения задержек.

> Content-Type — Указывает серверу/клиенту, в каком формате тело запроса (например, application/json).

> Accept — Указывает серверу, какие форматы ответа клиент может обрабатывать.

> Authorization — Несёт учетные данные (токены, basic auth) для аутентификации запросов.

> Кэширование — Использует заголовки вроде Cache-Control, ETag, Last-Modified для снижения нагрузки и задержек.

> ETag — Уникальный хеш для версии ресурса; помогает в условных запросах и кэшировании.

> Редиректы (3xx) — Инструктируют клиент попробовать другой URL (например, 301, 302, 307).

> CORS — Управляет тем, какие источники могут обращаться к вашему API из браузера.

> Preflight-запросы — Запросы типа OPTIONS, которые браузер отправляет перед некоторыми CORS-запросами для проверки разрешений.

> Туннелирование HTTP-методов — Некоторые прокси пропускают только GET/POST, поэтому PUT/DELETE инкапсулируются через POST + _method.

> User-Agent — Заголовок, который браузеры отправляют для идентификации (часто подделывается или изменяется).

> Referer — Заголовок, указывающий URL предыдущей страницы (используется в аналитике и безопасности).

> Host Header — Указывает домен, на который направлен запрос (важен при виртуальном хостинге).

> Connection Header — Управляет поведением соединения (например, close, keep-alive).

> HEAD-метод — Как GET, но возвращает только заголовки (без тела); полезен для проверки ресурсов.

👉 Java Portal
  • ❤ 7
  • 👍 6
Post #1452 2.34K
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
  • 👍 13
  • ❤ 6
  • 🔥 5
Post #1451 2.29K
Это просто огонь. В одном из следующих релизов jetbrains / intellijidea появится фича, которая позволяет в пару кликов сгенерировать JPA-энтити из существующей схемы БД

И ещё, мне сказали, что SpringData JDBC тоже скоро завезут 💪

👉 Java Portal
  • ❤ 10
  • 🔥 6
Post #1449 2.39K
Ставить @Transactional везде подряд плохая практика — сначала разберись, когда он действительно нужен:

🔸Использовать @Transactional только в сервисном слое — Отделяет бизнес-логику от веб-логики

🔸Использовать транзакции на уровне методов — Даёт точный контроль и ясность

🔸Использовать @Transactional(readOnly = true) — Оптимизирует операции только для чтения

🔸Избегать @Transactional в репозиториях — Репозитории не должны управлять транзакциями

🔸Оставлять транзакционные методы public — Необходимо для работы Spring-прокси

🔸Логировать или отслеживать поведение транзакций — Помогает выявлять неожиданные проблемы

👉 Java Portal
  • 👍 6
  • ❤ 3
  • 🔥 2
Post #1448 2.28K
Нашёл годную визуализацию для тех, кто хочет на пальцах понять, как устроены LLM. Тут можно не просто почитать про слои моделей, а буквально пощупать их, покрутить со всех сторон в 3D

Есть GPT-2, nanoGPT, GPT-2 XL и GPT-3

Лучше запускать с компа, на мобиле не так красиво

👉 Java Portal
  • 👍 7
  • ❤ 4
Post #1446 2.23K
10 однострочников на Java, с которыми ты выглядишь более опытным

🔸Поменять две переменные местами > a = a + b - (b = a);

🔸Создать список > List.of("Apple", "Banana", "Cherry");

🔸Найти максимум из двух чисел > Math.max(a, b);

🔸Прочитать все строки из файла > Files.readAllLines(Path.of("file.txt"));

🔸Объединить список в строку > String.join(", ", fruits);

🔸Удалить null-значения > list.removeIf(Objects::isNull);

🔸Получить случайный элемент > list.get(new Random().nextInt(list.size()));

🔸Посчитать совпадения > list.stream().filter(x -> x > 10).count();

🔸Отсортировать по убыванию > list.sort(Comparator.reverseOrder());

🔸Проверить палиндром str.equals(new StringBuilder(str).reverse().toString());

👉 Java Portal
  • ❤ 13
  • 🤔 4
  • 😁 2
  • 💊 1
Post #1444 2.06K
Структурированное логгирование в Spring Boot 3.5.5

Spring Boot 3.5.5 привносит улучшенную поддержку структурированного логгирования.

Чтобы включить его, добавьте в application.yml следующее:

logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} - %X - %msg%n"


Теперь логи будут более чистыми и структурированными, что упрощает их парсинг в инструментах вроде ELK, Grafana или Datadog.

👉 Java Portal
  • ❤ 6
  • 🔥 2
Post #1443 2.22K
image_2025-06-02_08-13-46.png1.3 MB
Шпаргалка по аннотациям безопасности Spring Security

@EnableWebSecurity —> Включает поддержку веб-безопасности Spring Security и интеграцию с Spring MVC. Применяется к конфигурационному классу для активации безопасности.

@EnableGlobalMethodSecurity / @EnableMethodSecurity (Spring Security 6+) —> Включает методный уровень безопасности (например, @PreAuthorize, @Secured). @EnableMethodSecurity — новая версия для Spring Security 6+.

@PreAuthorize("expression") —> Проверяет выражение SpEL до выполнения метода. Часто используется для ролевого доступа, например: @PreAuthorize("hasRole('ADMIN')").

@PostAuthorize("expression") —> Похожа на @PreAuthorize, но проверка происходит после выполнения метода. Полезно для фильтрации возвращаемых данных.

@Secured("ROLE_NAME") —> Разрешает доступ к методу только при наличии указанной роли. Менее гибкая, чем @PreAuthorize

@RolesAllowed("ROLE_NAME") —> Аннотация из JSR-250, ограничивает доступ по ролям. Требует включённой опции @EnableMethodSecurity(jsr250Enabled = true)

@AuthenticationPrincipal —> Внедряет текущего аутентифицированного пользователя (Principal или объект UserDetails) в контроллер или метод.

@WithMockUser —> Используется в тестах для эмуляции аутентифицированного пользователя с заданными ролями.

@PermitAll —> Разрешает доступ всем пользователям, включая неаутентифицированных. Требует поддержки JSR-250.

@DenyAll —> Запрещает доступ всем, включая аутентифицированных пользователей. Также входит в JSR-250.

👉 Java Portal
  • 👍 5
  • ❤ 3
  • 🔥 2
Post #1441 2.19K
Ищешь быстрый и удобный GUI для Git? Попробуй Gitnuro — кроссплатформенный клиент, написанный на Kotlin + Rust.

> Просмотр истории коммитов и изменений
> Стадирование, откат изменений (даже по отдельным строкам)
> Работа с ветками, тегами, и удалёнными репозиториями
> Поддержка операций pull, push, merge, rebase, stash
> Интерактивный rebase и просмотр blame
> Сравнение изображений и поддержка подмодулей
> Настраиваемые темы (JSON)
> Расширенный поиск по коммитам, авторам и ID 😊

👉 Java Portal
  • 👍 6
  • ❤ 3
Post #1440 2.26K
В этом гайде автор делится, как писать удобные интеграционные тесты в Spring Boot

Многие разработчики либо перегружают @SpringBootTest, либо пишут сложные конструкции с @MockBean. Но такие подходы тормозят сборку, плохо читаются и, что важнее всего — дают ложное чувство покрытия.

Класс MockMvc и аннотация @WebMvcTest делают тестирование контроллеров лёгким и быстрым, можно проверить весь HTTP-флоу без запуска сервера.

👉 Java Portal
  • ❤ 6
  • 🔥 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →