Java Portal | Программирование
11.6K subscribers
859 photos
66 videos
28 files
683 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
加入频道
Анонс: Azure Command Launcher для Java

jaz — новый инструмент запуска JVM, оптимизированный под Azure. Он предлагает более подходящие настройки по умолчанию для Java-приложений в контейнерах и на виртуалках.

И это ещё не всё — впереди больше обновлений. 🤙

> подробнее

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Понимание static, final, super, super(), this() и this в Java — это база для любого Java-разработчика.

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

> Читать подробнее с примерами 🫡

Полезно для интервью и системного понимания Java

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
JDK 21 сопоставление с шаблоном (pattern matching) для switch стало постоянной фичей, а не превью — согласно JEP 441

Теперь можно писать такой switch:

private String format(Number n) {
return switch (n) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case null -> "null";
default -> String.format("%s %s", n.getClass().getSimpleName(), n);
};
}


Такой switch-выражение во время выполнения под капотом обрабатывается через объект, созданный с помощью класса SwitchBootstraps.

Пример:

void main() throws Throwable {
print(123);
print(456L);
print(7.89);
print(null);
print(7.89F);
}

private void print(Number n) throws Throwable {
IO.println(format(n));
}

private String format(Number n) throws Throwable {
var lookup = MethodHandles.lookup();

var callsite = SwitchBootstraps.typeSwitch(
lookup,
"",
MethodType.methodType(int.class, Number.class, int.class),
Integer.class, Long.class, Double.class
);

var target = callsite.getTarget();
int result = (int) target.invokeExact(n, 0);

return switch (result) {
case 0 -> { Integer i = (Integer) n; yield String.format("int %d", i); }
case 1 -> { Long l = (Long) n; yield String.format("long %d", l); }
case 2 -> { Double d = (Double) n; yield String.format("double %f", d); }
case -1 -> "null";
default -> String.format("%s %s", n.getClass().getSimpleName(), n);
};
}


Результат выполнения:

int 123  
long 456
double 7.890000
null
Float 7.89


🔥 знал об этом
👍полезно

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Базовые вопросы по Core Java на собеседовании

1. В чём разница между == и .equals() в Java?
2. Объясните концепцию ООП в Java.
3. Чем отличаются HashMap, LinkedHashMap, TreeMap и Hashtable?
4. В чём разница между ArrayList и LinkedList?
5. Что такое контракт hashCode() и equals()?
6, Как работает управление памятью в Java (heap, stack, GC)?
7. Разница между final, finally и finalize()?
8. Какие бывают типы исключений в Java? Checked vs Unchecked?
9. Что такое синглтон-класс? Как его реализовать?
10. Объясните ключевые слова volatile, synchronized и transient

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Тридцатый день рождения Java

Сегодня 23 мая и Java исполняется 30 лет!

Java впервые вышла в альфа-версии в мае 1995 года, а первая публичная версия была выпущена в январе 1996 года

С юбилеем, родной 🥇

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Рассмотрим следующий Java-файл, в котором объявлены два класса — Library и Escape. Обратите внимание: класс Escape имеет package-private доступ, так как у него нет явного модификатора доступа:

// internal/Library.java
package internal;

public interface Library {
static Escape create() {
return new Escape();
}
}

class Escape {}


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

void main() {
Object a = internal.Library.create();
IO.println(a);

var b = internal.Library.create();
IO.println(b);

Object c = internal.Library.create();
IO.println(c.toString()); // обратите внимание на вызов toString()
}


Но если последнюю переменную c тоже объявить с использованием var, как здесь:

var c = internal.Library.create();


то компиляция завершится ошибкой:

"Object.toString() is defined in an inaccessible class or interface"


🔥 знал об этом
👍полезно

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Гайд на кэширование в Java с помощью Spring Boot, Redis и Docker

Если ты хочешь понять, как эффективно реализовать кэш в Java-приложении — в этом гайде рассказывается, как использовать связку Spring Boot + Redis внутри Docker-контейнера.

Подробно разбирается:

> как работает кэш, аннотации Spring (@Cacheable и др), настройка Redis и интеграция всего этого в микросервис.

Также показано, как протестировать кэш и избежать типичных ошибок.

Полезно для тех, кто хочет ускорить приложение и уменьшить нагрузку на БД 😡

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
maven-cheat-sheet.pdf
147.3 KB
Основные команды Maven для Java-разработчиков

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

$ mvn archetype:generate
Создание нового Maven-проекта

$ mvn clean
Очистка директории target

$ mvn compile
Компиляция исходного кода

$ mvn test
Запуск unit-тестов

$ mvn package
Сборка проекта в JAR/WAR

$ mvn install
Установка артефакта в локальный Maven-репозиторий

$ mvn install -DskipTests
Пропустить тесты при сборке

$ mvn spring-boot:run
Запуск Spring Boot приложения (если используется spring-boot-maven-plugin)

$ mvn dependency:resolve
Обновление зависимостей

$ mvn dependency:tree
Вывод дерева зависимостей

$ mvn clean compile package
Запуск целей в указанной фазе

$ mvn validate
Проверка структуры проекта


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое JWT?

⇨ JSON Web Token — это открытый стандарт (RFC 7519) для безопасной передачи данных между сторонами в виде JSON-объекта.
⇨ Это компактный и самодостаточный способ представить набор утверждений (claims) между двумя сторонами.

Структура JWT

JWT состоит из трёх частей, разделённых точками (.):

1. Header

⇨ Указывает алгоритм подписи (например, HS256 или RS256) и тип токена (JWT).

2. Payload (Claims)

⇨ Содержит утверждения о сущности (чаще всего — пользователе) и дополнительную информацию.

Типы claims:

➀ Registered claims — стандартизированные: iss, exp, sub, aud и т.д.
➁ Public claims — настраиваются вашим приложением.
➂ Private claims — используются по соглашению между сторонами.

3. Signature

⇨ Создаётся путём подписи закодированных header и payload с использованием секрета или приватного ключа.
⇨ Гарантирует подлинность и целостность токена.
Безопасность

При работе с JWT и другими механизмами аутентификации очень важен качественный ревью код.

Инструменты вроде coderabbitai помогают находить уязвимости уже на этапе pull request'ов — с контекстным и построчным анализом.

Такие помощники формируют привычку писать безопасный и чистый код с самого начала 💖

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации кэширования Spring Boot

@EnableCaching
// Включает кэш в проекте
// Ставится на конфигурационный класс

@Cacheable
// Кэширует результат метода
// Используй для дорогих в вычислении методов

@CachePut
// Обновляет кэш новым результатом
// Когда метод меняет данные и нужно обновить кэш

@CacheEvict
// Удаляет записи из кэша
// При удалении или обновлении данных

@Caching
// Объединяет несколько кэш-аннотаций
// Когда на методе нужно и @Put, и @Evict, и т.д.

@CacheConfig
// Общие настройки кэша на уровне класса
// Чтобы не дублировать параметры в каждой аннотации


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Нашёл полезную и простую статью про докеризацию Spring Boot.

Внутри — три подхода к сборке Docker-образов

> Классический Dockerfile
> Buildpacks через Spring Boot Maven Plugin
> Google Jib — без Docker и без Dockerfile, всё через Maven/Gradle

— примеры кода, запуск, деплой, советы и сравнение подходов.

Отлично подойдёт для джунов и тех, кто только начинает знакомство с Docker.

Рекомендую, чтиво полезное 😊

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вы использовали сопоставление с образцом (pattern matching) для instanceof?

До Pattern Matching:

Object obj = "Hello Java!";
if (obj instanceof String) {
String s = (String) obj; // Лишнее приведение типа
System.out.println(s.length());
}


Здесь нужно вручную приводить тип, хотя компилятор уже знает, что obj — это String.

С Pattern Matching (начиная с Java 16+):

Object obj = "Hello Modern Java!";
if (obj instanceof String s) { // s автоматически приводится к типу String
System.out.println(s.length());
}


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Нашёл годную статью — подробный гайд по ООП в Java: принципы, концепты и реальные примеры. Если ты новичок или хочешь освежить базу — заходи смело. Всё объяснено доступно и с кодом. Приятного чтения 💪

> источник

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Интерфейс JpaRepository

Это готовое решение для CRUD-операций. Просто унаследуйся от JpaRepository<Entity, ID> — и получи save, find, delete, update без лишнего кода

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает FlatMap в Java?

Mapping


Из исходного потока каждый элемент проходит через функцию, которая возвращает новый поток.

Это отличается от map(), так как здесь функция возвращает потоки, а не отдельные значения.

Flattening

Поскольку на предыдущем шаге мы получили несколько потоков, этот шаг просто объединяет их в один поток.

Синтаксис и параметры
для flatMap():

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)


> R — тип элементов в результирующем потоке.
> T — тип элементов во входном потоке.
> mapper — функция, которая преобразует элемент типа T во входном потоке в поток элементов типа R.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-05-27_07-57-06.png
255 KB
Java Lombok: Аннотация @Data — всё в одном

Аннотация @Data объединяет в себе несколько часто используемых аннотаций Lombok:

> @ToString — генерирует метод toString()
> @Getter — создаёт геттеры для всех нестатических полей
> @Setter — создаёт сеттеры для всех нестатических полей
> @EqualsAndHashCode — генерирует equals() и hashCode()
> @RequiredArgsConstructor — создаёт конструктор для всех final и @NonNull полей

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
JDK 25: String::hashCode стал быстрее

В новой версии JDK 25 улучшили производительность класса String: теперь метод String::hashCode в большинстве случаев сворачивается на этапе компиляции (constant folding).

Это значит:
– Меньше затрат в рантайме
– Быстрее работа с ключами в HashMap
– Эффективнее часто используемые строки

Подробнее: https://social.ora.cl/6014274Ew

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Каждый разработчик использует шаблоны проектирования ежедневно, даже не осознавая этого:

> Используешь DI, когда аннотируешь поле @Autowired или полагаешься на Spring для автосвязывания бинов.

> Вызываешь Executors.newFixedThreadPool() — это паттерн Factory, возвращающий настроенный объект.

> Передаёшь Comparator в Collections.sort() — это паттерн Strategy, позволяющий задать поведение на лету.

> PropertyChangeListener в Swing или ApplicationListener в Spring — это паттерн Observer.

> StringBuilder.append() — это паттерн Builder, пошагово создающий объект.

> Оборачиваешь BufferedReader вокруг InputStreamReader — это паттерн Decorator

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Spring Batch упрощает управление ETL-задачами

Просто определи job'ы, step'ы и chunk'и — остальное он сделает сам

Из коробки поддерживает транзакции, повторы и отслеживание статуса заданий

Вот краткое введение в Spring Batch с практическим примером переноса данных из CSV в XML — тык 🪑

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Звучит знакомо:

Почему у этого свойства такое значение?
С какой базой данных работает моё приложение?
Какие бины активны?

Встречайте Spring Debugger — плагин для IntelliJ IDEA, который показывает, что на самом деле происходит в вашем приложении с аннотацией @SpringBoot 🥺

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM