Ставить
🔸 Использовать
🔸 Использовать транзакции на уровне методов — Даёт точный контроль и ясность
🔸 Использовать
🔸 Избегать
🔸 Оставлять транзакционные методы
🔸 Логировать или отслеживать поведение транзакций — Помогает выявлять неожиданные проблемы
👉 Java Portal
@Transactional
везде подряд плохая практика — сначала разберись, когда он действительно нужен:@Transactional
только в сервисном слое — Отделяет бизнес-логику от веб-логики@Transactional(readOnly = true)
— Оптимизирует операции только для чтения@Transactional
в репозиториях — Репозитории не должны управлять транзакциямиpublic
— Необходимо для работы Spring-проксиPlease open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Это просто огонь. В одном из следующих релизов jetbrains / intellijidea появится фича, которая позволяет в пару кликов сгенерировать JPA-энтити из существующей схемы БД
И ещё, мне сказали, что SpringData JDBC тоже скоро завезут💪
👉 Java Portal
И ещё, мне сказали, что SpringData JDBC тоже скоро завезут
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥6
Java Generics — всё, что нужно знать
1.
• Используй, когда класс работает с любым типом (например, обёртка вокруг любого объекта, как Box<User>, Box<Integer>).
2.
• Используй, когда метод должен принимать любой тип (например, для печати любого объекта, логирования, сравнения и т.п.).
3.
• Называется верхней границей.
• Используй, когда тип должен быть подклассом чего-то (например, утилита для работы с int, double, float).
4.
• Заставляет T реализовывать и A, и B.
• Используй, когда нужны обе особенности (например, сортировка объекта, который также требует валидации).
5.
• Это означает неизвестный тип.
• Используй, когда не важен тип, нужно только читать (например, печать элементов из любого списка).
6.
• Означает некоторый подкласс T.
• Используй при чтении из коллекции (например, чтение чисел из List<? extends Number> без модификации).
7.
• Означает некоторый суперкласс T.
• Используй при записи в коллекцию (например, добавление
8. Правило PECS
• Producer Extends, Consumer Super.
• Используй
9.
• Это сырой тип.
• Избегай — тк теряется типовая безопасность (например, компилятор не поймает, если добавишь неверные типы).
10. Стирание типов
• Java удаляет всю информацию об обобщениях во время выполнения.
• Поэтому нельзя использовать
11. Обобщённый конструктор
• Используй, когда конструктору нужен обобщённый параметр, даже если сам класс не обобщённый (например, инициализация с динамическими типами).
12. Обобщённый интерфейс
• Используй при преобразовании одного типа в другой (например, DTO → сущность).
13. Нельзя использовать примитивы
• Нельзя
• Используй обёртки (коллекции могут хранить только объекты, не примитивы).
14. Нельзя создавать массивы с обобщением
•
• Используй
15. Нельзя использовать подстановочные типы для вставки
• Нельзя вставлять в
• Используй
👉 Java Portal
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>
, если нужна вставка (например, для пакетной обработки или модификации коллекции).Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤6🔥5
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
> 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, но возвращает только заголовки (без тела); полезен для проверки ресурсов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍6
SQL Basics.pdf
102.8 KB
Держите годноту: подборка полезных шпаргалок по SQL
— Основы языка SQL
— SQL Joins
— Оконные функции
— SQL для анализа данных
Сохраняем и используем
👉 Java Portal
— Основы языка SQL
— SQL Joins
— Оконные функции
— SQL для анализа данных
Сохраняем и используем
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3
Java API Tip
Безопасное приведение
Используй
Без него преобразование произойдёт молча — и ты можешь получить некорректный результат без всяких ошибок.
Используй
👉 Java Portal
Безопасное приведение
long
к int
Используй
Math.toIntExact()
— этот метод возвращает значение long, но выбрасывает ArithmeticException
, если оно не помещается в int
Без него преобразование произойдёт молча — и ты можешь получить некорректный результат без всяких ошибок.
Используй
toIntExact
, когда важно контролировать переполнениеPlease open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3
Дженерики в Java (2004) изменили всё.
Типобезопасность + гибкость.
Сначала вызывали сомнения, теперь — основа коллекций и API.
// До дженериков: отсутствие типобезопасности
// С дженериками: типобезопасно и понятно
// Пример из реального API: Optional<T>
👉 Java Portal
Типобезопасность + гибкость.
Сначала вызывали сомнения, теперь — основа коллекций и 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();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5
This media is not supported in your browser
VIEW IN TELEGRAM
Указание типа после ключевого слова
Об этом и многом другом — в видео
👉 Java Portal
new
— это действительно допустимая конструкция в Java.Об этом и многом другом — в видео
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5❤3
Хотите добавить динамическое поведение в ваши Java-классы?
Используйте библиотеку Java Class Extension Library для добавления динамических операций к существующим классам или для предоставления реализаций интерфейсов "на лету"
Кстати, теперь эта библиотека включает новый механизм circuit breaker (автоматическое прерывание цепочки вызовов)
Это позволяет легко добавить функциональность circuit breaker к любой из ваших операций — без изменений в исходном коде😨
👉 Java Portal
Используйте библиотеку Java Class Extension Library для добавления динамических операций к существующим классам или для предоставления реализаций интерфейсов "на лету"
Кстати, теперь эта библиотека включает новый механизм circuit breaker (автоматическое прерывание цепочки вызовов)
Это позволяет легко добавить функциональность circuit breaker к любой из ваших операций — без изменений в исходном коде
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4❤3
Хочешь разобраться в геймдеве — разберись в чужом проекте с открытым кодом
Вот отличный кандидат: Gloomy Dungeons II — классический 3D-шутер на Android, вдохновлённый Doom и Wolfenstein.
Открытый MIT-проект на Java, с кастомным движком, освещением, текстурами и даже ракетницей.
➡️ Cсылка на GitHub
👉 Java Portal
Вот отличный кандидат: Gloomy Dungeons II — классический 3D-шутер на Android, вдохновлённый Doom и Wolfenstein.
Открытый MIT-проект на Java, с кастомным движком, освещением, текстурами и даже ракетницей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥4👍2😁1🤣1
This media is not supported in your browser
VIEW IN TELEGRAM
Если хотите прокачаться в системном дизайне, разберитесь с этими концептами:
> API Gateway vs Load Balancer — ссылка
> Reverse Proxy vs Forward Proxy — ссылка
> Горизонтальное и вертикальное масштабирование — ссылка
> Микросервисы и монолитная архитектура — ссылка
👉 Java Portal
> API Gateway vs Load Balancer — ссылка
> Reverse Proxy vs Forward Proxy — ссылка
> Горизонтальное и вертикальное масштабирование — ссылка
> Микросервисы и монолитная архитектура — ссылка
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Типы массивов в Java
В Java существует два основных типа массивов:
Регулярные массивы — фиксированное число строк и столбцов
Регулярные массивы делятся на:
> 1-мерные массивы
> 2-мерные массивы
> 3-мерные и более
Во всех случаях каждая строка содержит одинаковое количество элементов.
> Зубчатые массивы
Это массив массивов, в котором вложенные массивы могут иметь разную длину.
Можно создавать 2D или 3D массивы с переменным числом столбцов в каждой строке.
Одномерный массив (1D array) — это список элементов, хранящихся в одной строке. Он используется для хранения нескольких значений одного типа в линейной форме
Синтаксис:
или
Пример: Список студентов в одном классе.
Вывод:
👉 Java Portal
В Java существует два основных типа массивов:
Регулярные массивы — фиксированное число строк и столбцов
Регулярные массивы делятся на:
> 1-мерные массивы
> 2-мерные массивы
> 3-мерные и более
Во всех случаях каждая строка содержит одинаковое количество элементов.
> Зубчатые массивы
Это массив массивов, в котором вложенные массивы могут иметь разную длину.
Можно создавать 2D или 3D массивы с переменным числом столбцов в каждой строке.
Одномерный массив (1D array) — это список элементов, хранящихся в одной строке. Он используется для хранения нескольких значений одного типа в линейной форме
Синтаксис:
dataType[] arrayName = new dataType[size];
или
dataType[] arrayName = {value1, value2, value3, ...};
Пример: Список студентов в одном классе.
class MasterBackend {
public static void main(String[] args) {
// 1D Array: Students in a single class
String[] students = {"Ayush", "Rahul", "Neha", "Priya"};
System.out.println("Students in a class:");
for (String student : students) {
System.out.println(student);
}
}
}
Вывод:
Students in a class:
Ayush
Rahul
Neha
Priya
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥1
Инструменты повышения продуктивности и качества кода в Java
1. Lombok — устраняет шаблонный код, автоматически генерируя геттеры, сеттеры, конструкторы и т.д.
2. MapStruct — генерирует типобезопасные мапперы между DTO и сущностями на этапе компиляции.
3. JRebel — позволяет горячую перезагрузку классов Java без перезапуска приложения (экономит массу времени).
4. SonarLint — линтер в IDE в реальном времени для обнаружения багов и "запахов кода" по мере написания.
5. SonarQube — платформа статического анализа кода с дашбордами и quality gates.
6. Checkstyle — обеспечивает соблюдение стандартов кодирования и правил оформления.
7. SpotBugs — сканирует байткод для выявления потенциальных ошибок и проблем с производительностью.
👉 Java Portal
1. Lombok — устраняет шаблонный код, автоматически генерируя геттеры, сеттеры, конструкторы и т.д.
2. MapStruct — генерирует типобезопасные мапперы между DTO и сущностями на этапе компиляции.
3. JRebel — позволяет горячую перезагрузку классов Java без перезапуска приложения (экономит массу времени).
4. SonarLint — линтер в IDE в реальном времени для обнаружения багов и "запахов кода" по мере написания.
5. SonarQube — платформа статического анализа кода с дашбордами и quality gates.
6. Checkstyle — обеспечивает соблюдение стандартов кодирования и правил оформления.
7. SpotBugs — сканирует байткод для выявления потенциальных ошибок и проблем с производительностью.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15