Java | Фишки и трюки
الذهاب إلى القناة على Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg
إظهار المزيد6 817
المشتركون
-524 ساعات
-107 أيام
-6530 أيام
أرشيف المشاركات
6 815
🧪 Java Agents — как влезть в чужой
.jar и следить за ним изнутри
Нужно посмотреть, какие классы грузятся в рантайме?
Или вставить лог прямо в чужой метод, не трогая исходник?
Java Agent запускается до `main()` и даёт доступ ко всему, что загружается в JVM.
🔧 Шаг 🔢: создаём агент
public class SpyAgent {
public static void premain(String args, Instrumentation inst) {
System.out.println("👁 Агент стартовал");
}
}
➡️ Метод premain() будет вызван раньше `main()` обычного приложения.
Параметры:
🟢 args — аргументы, переданные агенту
🟢 Instrumentation — интерфейс для перехвата и изменения классов
🧲 Шаг 🔢: перехватываем загрузку классов
inst.addTransformer(new ClassFileTransformer() {
@Override
public byte[] transform(ClassLoader loader, String className,
Class<?> classBeingRedefined, ProtectionDomain domain,
byte[] classfileBuffer) {
if (className.contains("Service")) {
System.out.println("🎯 Загружается: " + className);
}
return null;
}
});
➡️ Каждый раз, когда JVM грузит класс — агент получает байты.
Если хочешь, можешь их изменить и отдать «новую» версию класса.
🗂 Шаг🔢: манифест — как JVM узнает, что это агент
Создаём MANIFEST.MF:
Premain-Class: SpyAgent Can-Redefine-Classes: trueСобираем
.jar с этим манифестом:
jar cmf MANIFEST.MF spy-agent.jar SpyAgent.class
🚀 Шаг 4: подключаем агент к приложению
java -javaagent:spy-agent.jar -jar victim.jar
➡️ JVM загрузит твой агент, вызовет premain(), и только потом запустит main() из victim.jar.
🔁 Пример: вставляем поведение с ByteBuddy
new AgentBuilder.Default()
.type(named("com.example.Target"))
.transform((builder, type, cl, module) ->
builder.method(named("process"))
.intercept(MethodDelegation.to(LoggerInterceptor.class))
).installOn(inst);
public class LoggerInterceptor {
@RuntimeType
public static void intercept() {
System.out.println("📦 Метод process() вызван");
}
}
➡️ Агент находит нужный класс, перехватывает метод и вставляет лог.
Ты не меняешь исходник — всё происходит на лету, при загрузке.
🧱 Структура проекта:
spy-agent/ ├── SpyAgent.java ├── LoggerInterceptor.java ├── MANIFEST.MF🗣️ Запомни: Java Agent — это способ влезть в чужое приложение до его запуска.Ты можешь видеть всё, что грузится, менять методы, добавлять поведение — не касаясь исходников и не пересобирая
.jar.6 815
Как живет айтишник, который зарабатывает 5000$ в мес?
Живет хорошо! За глубокие знания и умение решать самые сложные задачи его ценят в любой команде: от стартапа до крупной корпорации. А он умеет продавать себя, получать лучшие предложения на работу и эффективно распределять время.
Для этого нужно всего 5 минут в день читать канал айтишника.
Здесь вы найдёте практические советы, инсайды и секреты от разработчика с 11+ лет опыта, о которых не рассказывают на курсах.
5 минут на канале заменят месяцы самостоятельного изучения.
Подписывайтесь: https://t.me/+WCs9hbWsww1iZjJi
6 815
👻 Ghost Interfaces: тип как флаг без логики — и это работает
Java позволяет создавать интерфейсы без методов. Они ничего не делают.
Но если ты дашь этот интерфейс классу — ты отмечаешь объект как "особенный".
Это и есть ghost interface — маркерный интерфейс, флаг через тип.
📛 Пример: метка для доступа
public interface AdminAccess {
// ничего не требует, просто существует
}
public class User {}
public class AdminUser extends User implements AdminAccess {}
➡️ AdminUser не обязан ничего переопределять.
Но теперь ты можешь понять, что это админ, просто глядя на тип.
🧪 Проверка — через instanceof
void check(User u) {
if (u instanceof AdminAccess) {
System.out.println("✅ Доступ разрешён");
} else {
System.out.println("⛔️ Нет прав");
}
}
➡️ Вот где начинается магия: поведение зависит от типа, а не от полей или флагов.
🛠 Применение на практике
Смотри, тебе нужно различать обычные запросы и те, что требуют валидации.
Не хочешь городить if (request.needsValidation())? — решается в один тип.
public interface RequiresValidation {}
public class LoginRequest implements RequiresValidation {}
public class PingRequest {}
void handle(Object req) {
if (req instanceof RequiresValidation) {
System.out.println("🔍 Проверка данных");
} else {
System.out.println("🚀 Без валидации");
}
}
➡️ Никаких полей. Просто интерфейс как ярлык.
💾 Другой кейс — запрет на сохранение
public interface ReadOnly {}
public class ConfigFile implements ReadOnly {}
public class LogFile {}
void save(Object file) {
if (file instanceof ReadOnly) {
throw new RuntimeException("❌ Это read-only");
}
System.out.println("💾 Сохраняем файл...");
}
➡️ Без boolean readonly, без .getPermissions() — просто instanceof.
📦 Комбинации: объект — это набор флагов
public interface JsonSerializable {}
public interface RequiresAuth {}
public class ApiRequest implements JsonSerializable, RequiresAuth {}
if (req instanceof JsonSerializable) {
System.out.println("📤 Преобразуем в JSON");
}
if (req instanceof RequiresAuth) {
System.out.println("🔐 Проверяем токен");
}
➡️ Всё как в декларации типа: сам объект описывает себя.
📚 enum тоже работает
public interface Internal {}
public enum Command implements Internal {
REBOOT, SHUTDOWN
}
void dispatch(Enum<?> cmd) {
if (cmd instanceof Internal) {
System.out.println("🔐 Внутренняя команда");
} else {
System.out.println("🌍 Публичная");
}
}
➡️ Даже enum может быть "помечен" ghost-интерфейсом.
🗣 Запомни: Ghost Interfaces — это не костыль, а чистый, типовой способ описывать поведение.Они не делают, а говорят. Всё, что нужно — instanceof.Пиши логику по типу, не по данным.6 815
⚡️Хотите стать Android-разработчиком и создавать масштабируемые мобильные приложения с нуля?
Курс «Android Developer» идеален для новичков, которые хотят попасть в IT, а также для тестировщиков и сисадминов, желающих перейти в разработку. За 10 месяцев обучения вы освоите Kotlin, научитесь разрабатывать приложения на Android SDK, работать с фреймворками Dagger2, RxJava и Jetpack Compose, а также освоите тестирование и CI/CD.
Мы научим вас проектировать многомодульные архитектуры, работать с базами данных (Room, DataStore), создавать UI, использовать современные фреймворки и оптимизировать приложения. Все это с реальными задачами, которые помогут вам построить сильное портфолио и стать успешным разработчиком.
📲Оставьте заявку и получите скидку на обучение:
https://otus.pw/qWbB/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
6 815
☕️Введение в Swing | Как создать графический калькулятор на Java?
Это видео показывает, как создать простой графический калькулятор на Java с использованием Swing. Подойдёт новичкам: шаг за шагом разбирается создание кнопок, полей ввода и обработка событий. Отличный старт для изучения GUI-разработки на Java.🤩 Java Фишки и трюки || #Видео
6 815
⛓️ Chain of Responsibility на
enum-ах — антипаттерн, который работает
Chain of Responsibility — это когда у тебя есть цепочка проверок или действий, которые обрабатываются по очереди, пока не будет «готово» или «отказ».
В Java обычно это: интерфейс + куча обработчиков.
Но можно сделать проще: на `enum` с абстрактными методами.
🔧 Пример: валидация пользователя
enum UserValidator {
CHECK_NAME {
boolean validate(User u) {
return u.name != null && !u.name.trim().isEmpty();
}
},
CHECK_AGE {
boolean validate(User u) {
return u.age >= 18;
}
},
CHECK_EMAIL {
boolean validate(User u) {
return u.email != null && u.email.contains("@");
}
};
abstract boolean validate(User u);
}
Каждый enum — это как мини-обработчик.
Ты прямо внутри перечисления задаёшь поведение.
Код не размазан по 10 классам и не требует интерфейсов.
🔁 Проверка по цепочке
User user = new User("Neo", 30, "neo@matrix.io");
boolean valid = Arrays.stream(UserValidator.values())
.allMatch(v -> v.validate(user));
➡️ Если все валидаторы вернули true — пользователь валиден.
⚠️ Обработка ошибок поимённо
Arrays.stream(UserValidator.values())
.filter(v -> !v.validate(user))
.forEach(v -> System.out.println("⛔️ Ошибка в: " + v.name()));
📌Ты можешь узнать, что именно не прошло, без лишних if'ов.
🧪 Альтернатива: остановиться на первом ошибочном
Optional<UserValidator> failed = Arrays.stream(UserValidator.values())
.filter(v -> !v.validate(user))
.findFirst();
if (failed.isPresent()) {
System.out.println("Провал на шаге: " + failed.get().name());
}
➡️ Удобно, если хочешь быстро выйти из цепочки.
📦 Всё это работает с обычными классами
class User {
String name;
int age;
String email;
User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
🗣️ Запомни: Иногда enum с методами — это рабочий компромисс, когда не хочется поднимать тяжёлый Chain of Responsibility.Просто, читаемо, удобно. Особенно для валидаций, фильтров, конвертаций и тестов.6 815
Посты на какие темы вы хотели бы увидеть на нашем канале? Пишите в комметариях.
6 815
🛰 Embedded JavaScript в JVM — запускаем JS в Java без WebView
Хочешь встроить JavaScript в Java-приложение?
Без браузера, без WebView, просто для вычислений, шаблонов, скриптов или конфигов?
Это возможно — через встроенные скриптовые движки. Работает с JDK 8+, на проде, без зависимостей (или с GraalVM).
✅ Как это вообще работает?
Java включает JS-движок (Nashorn до Java 14), а после — можно подключить GraalVM JavaScript.
Через
javax.script.ScriptEngine ты можешь:
🟢 выполнять JS-код;
🟢 вызывать JS-функции из Java;
🟢 передавать переменные между языками;
🟢 использовать JS как DSL внутри проекта.
🔧 Простой запуск скрипта
import javax.script.*;
public class Demo {
public static void main(String[] args) throws Exception {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");
engine.eval("print('Привет из JavaScript');");
}
}
✔️ Всё — ты только что исполнил JS прямо в JVM.
📥 Передаём переменные
engine.put("name", "Neo");
engine.eval("print('Hello, ' + name);"); // Hello, Neo
Ты можешь прокидывать данные из Java в JS — и наоборот.
📌 Вызываем JS-функцию из Java
engine.eval("function add(a, b) { return a + b; }");
Invocable inv = (Invocable) engine;
Object result = inv.invokeFunction("add", 5, 7);
System.out.println(result); // 12
➡️ Используй как простую встроенную логику.
🧠 Пример — вычисление формулы из строки
String expr = "price * qty + tax";
Bindings vars = engine.createBindings();
vars.put("price", 100);
vars.put("qty", 2);
vars.put("tax", 50);
Object result = engine.eval(expr, vars);
System.out.println(result); // 250
Очень удобно для настройки расчётов пользователем без пересборки кода.
⚙️ Подключение GraalVM JS (если JDK >14)
<dependency>
<groupId>org.graalvm.js</groupId>
<artifactId>js</artifactId>
<version>23.1.1</version>
</dependency>
Context context = Context.create("js");
Value result = context.eval("js", "2 + 2");
System.out.println(result.asInt()); // 4
GraalVM даёт современный JS с поддержкой всего ES6+.
🗣️ Запомни:Embedded JavaScript — это про гибкость без внешних зависимостей.
Хочешь дать пользователю конфиги на JS? Или динамически описывать поведение? Или быстро собрать вычислитель формул?Ты можешь запускать JavaScript напрямую в JVM — просто, безопасно и эффективно.6 815
😈Переиграли и уничтожили
SkillBox’y привет, всем остальным соболезную. Залили новые курсы, забирайте ниже:
➖Python (64гб курсов)
➖C# (27гб курсов)
➖Java (45гб курсов)
➖PHP (34гб курсов)
➖Go (23гб курсов)
➖Rust (37гб курсов)
➖SQL (41гб курсов)
➖MySQL (21гб курсов)
➖Другое (114гб курсов)
Не видео на ютуб, а реальный СЛИВ огромных баз. Проверь сам!🚨
6 815
☕️ Эффектом observability: мониторинг Java‑микросервисов без бюджета
В микросервисной архитектуре наблюдаемость — не роскошь, а умение выжить в проде. Как сделать качественный мониторинг без затратных решений? Ответ в новой статье от Anderson Kuntz Meurer.
🔍 В статье вы узнаете:
📌 Три ключевых слоя наблюдаемости: метрики (Prometheus+Grafana), логи (Loki/ELK) и трассировки.
📌 Реальный пример: Docker‑стек с Spring Boot и Open Telemetry агентом.
📌 Как привязать
@RestController к метрикам — HTTP‑статы, latency, ошибки.
📌 Как настроить сбор и визуализацию трассировки (spans, trace‑ID) между микро сервисами .
📌 Почему это — тот минимум, без которого продакшн‑микросервисы — не Продакшн.
➡️ Читайте и наслаждайтесь
🗣️ Бюджетный стек — не значит посредственный. Если хочешь стабильный, масштабируемый прод, начни с observability, сделай стек понятным и системным.
🤩 Java Фишки и трюки || #Java #Observability #Статья6 815
⌨️ Полезные стримы. Группировка
Дан список людей с именем и городом проживания. Нужно сгруппировать их по городам.
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
record Person(String name, String city) {}
public class StreamExample {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("Alice", "New York"),
new Person("Bob", "Los Angeles"),
new Person("Charlie", "New York"),
new Person("David", "Los Angeles"),
new Person("Edward", "San Francisco")
);
Map<String, List<Person>> peopleByCity = people.stream()
.collect(Collectors.groupingBy(Person::city));
peopleByCity.forEach((city, peopleInCity) -> {
System.out.println(city + ": " + peopleInCity.stream()
.map(Person::name)
.collect(Collectors.joining(", ")));
});
// Вывод:
// San Francisco: Edward
// New York: Alice, Charlie
// Los Angeles: Bob, David
}
}
#java #stream #grouping6 815
+6
🖥 Хочешь прокачаться в Java, но устал от разбросанных туториалов?
Ты теряешь месяцы на YouTube, когда всё можно было бы уместить в один PDF
📄 Авторы крупнейшего Java канал сделали PDF-гайд, в котором всё по-человечески:
• без воды
• с примерами
• коротко и по делу
Отлично подходит для новичков
Понял → Применил → Пошёл дальше
Получить полностью бесплатный гайд можно здесь.
6 815
В Java цикл for-each позволяет перебирать элементы массивов, коллекций и других итерируемых объектов без необходимости использовать индексы или итераторы. Однако, для того чтобы вы могли использовать for-each для перебора элементов своего собственного класса, этот класс должен реализовать интерфейс
Iterable и предоставить метод iterator(), возвращающий объект, реализующий интерфейс Iterator.
В результате можно использовать for-each для перебора элементов этого класса, как если бы это был обычный массив или коллекция.
Вы можете адаптировать этот пример для своих собственных классов, реализуя интерфейс Iterable и предоставив соответствующий итератор, чтобы использовать for-each для вашего класса.6 815
⭐⭐🖥🖥🧑💻👩💻🖥⭐⭐📢
Казань, пора выкатывать лето на прод
12 июля в вашем городе пройдет ИТ-фестиваль «Сезон кода» для опытных backend-разработчиков, аналитиков, QA-инженеров и других специалистов.
Группа Т-Технологий и спикеры из Т-Банка зовут обмениваться опытом и слушать доклады под открытым небом.
Будет 3 секции, где вы узнаете:
— Как клиентоориентированный код решает задачи пользователей и бизнеса.
— Как идеи становятся технологиями и упрощают работу инженеров.
— Какие приемы используются в backend-разработке и как устроены продукты группы Т-Технологий.
Кейсы, вдохновение и развлечения тоже будут. Успейте зарегистрироваться до 10 июля.
Подробности тут
6 815
☕️ `var` в Java — типы без шума
Java 10 принес
var — возможность писать меньше кода без потери типов. Он не делает Java динамической, но помогает писать чище и быстрее.
⚡️ До и после var
📌 Было:
HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();
📌 Стало:
var map = new HashMap<String, List<Integer>>();
👉 Код стал вдвое короче, но компилятор по-прежнему знает точный тип.
🔁 Циклы:
var list = List.of("A", "B", "C");
for (var item : list) {
System.out.println(item);
}
🔍 item — автоматически String. Работает идеально с Map:
var map = Map.of("one", 1, "two", 2);
for (var entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
🔄 Stream API
var names = List.of("john", "jane", "max");
var upper = names.stream()
.map((var name) -> name.toUpperCase())
.filter(n -> n.startsWith("J"))
.toList();
👉 Лаконично, читаемо, с сохранением типовой строгости.
🧪 Использование с методами
var user = getUser(); // Что возвращает getUser?
⚠️ Неочевидно. Лучше явно:
User user = getUser();
или хотя бы:
var user = getUser(); // getUser() → User
✍️ Пиши комментарий, если тип важен для читаемости.
💡 Когда var — 🔥
Тип очевиден из правой части:
var url = new URL("https://example.com");
Тип слишком громоздкий:
var map = new HashMap<String, Map<Integer, Set<List<String>>>>();
В локальных временных переменных:
var tmp = Files.readAllLines(Path.of("file.txt"));
❌ Когда лучше не использовать
var result = doStuff();
⚠️ Тип неочевиден — хуже читается. Особенно в API, сигнатурах и публичных методах:
// Так нельзя
public var getUser() { ... }
📛 var работает только локально, и только с инициализацией:
var x; // ❌ ошибка
var list = null; // ❌ ошибка
🗣️ Запомни: var — не фишка ради фишки. Он помогает избавиться от шума там, где типы очевидны. Не злоупотребляй, но используй — особенно в стримах, циклах, дженериках и временных переменных.6 815
🐍💩👩💻👩💻🧑💻🧑💻🐧👩💻🧑💻👩💻👩💻
В сети начали массово сливать курсы и книги известных онлайн школ по айти
Вот отсортированная база с тонной материала (постепенно пополняется):
(363 видео, 87 книги) — Python
(415 видео, 68 книги) — Frontend
(143 видео, 33 книги) — ИБ/Хакинг
(352 видео, 89 книги) — С/С++/C#
(343 видео, 87 книги) — Java/QA
(176 видео, 32 книги) — Git/Linux
(174 видео, 91 книги) — DevOps
(167 видео, 53 книги) — PHP/1С
(227 видео, 83 книги) — SQL/БД
(114 видео, 77 книги) — Сисадмин
(107 видео, 43 книги) — BA/SA
(181 видео, 32 книги) — Go/Rust
(167 видео, 43 книги) — Kotlin/Swift
(112 видео, 24 книги) — Flutter
(137 видео, 93 книги) — DS/ML
(113 видео, 82 книги) — GameDev
(183 видео, 37 книги) — Дизайн
(136 видео, 33 книги) — PM/HR
Скачивать ничего не нужно — все выложили в Telegram
6 815
🧵 Virtual Threads (Project Loom) — тысячи потоков без overhead’а
Хочешь запускать 10 000 параллельных задач в Java без боли с thread pool?
Теперь можно — с virtual threads. Это не абстракция, это реальность с Java 21.
🔧 Пример 1: 100 000 задач — без проблем
import java.util.concurrent.*;
public class Demo {
public static void main(String[] args) {
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 100_000; i++) {
executor.submit(() -> {
Thread.sleep(1000);
return null;
});
}
}
}
}
⏱️ В обычных потоках такой код бы уронил JVM или занял бы гигабайты памяти.
А здесь — запускается моментально.
🔧 Пример 2: простой виртуальный поток без Executor'а
Thread.startVirtualThread(() -> {
System.out.println("Привет из виртуального потока!");
});
Никаких ExecutorService, никаких пулов — просто и понятно.
🔧 Пример 3: параллельные HTTP-запросы
var urls = List.of(
"https://example.com", "https://google.com", "https://github.com"
);
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
urls.forEach(url -> executor.submit(() -> {
var content = new String(new URL(url).openStream().readAllBytes());
System.out.println("Получено с " + url + ": " + content.length() + " байт");
}));
}
📎 Virtual threads идеально подходят для сетевого I/O.
🔧 Пример 4: обработка запросов к серверу
while (true) {
var socket = serverSocket.accept();
Thread.startVirtualThread(() -> handle(socket));
}
Каждое подключение — отдельный виртуальный поток.
Такой сервер обрабатывает десятки тысяч клиентов — легко.
🗣️ Запомни: Ты больше не пишешь async-коллбеки и не страдаешь с пулом.
Теперь можно писать простой, читаемый blocking-код,
а JVM делает всю тяжёлую работу под капотом.6 815
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
Айтишники поймут
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠ
ᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠᅠ
6 815
💎 Clean Code на Java — идиоматические приёмы, которые реально работают
Хочешь писать Java-код, который приятно читать и легко сопровождать?
Вот не теория с книжек, а настоящие идиомы, шаблоны и фишки, которые делают код чистым, понятным и «живым».
👍 1. Именование — полдела
❌ Плохо:
double d = get(a, b);
✔️Лучше:
double distance = calculateDistance(startPoint, endPoint);
Именуй переменные и методы так, чтобы код сам говорил, что он делает.
👍 2. if без else — код легче читать
❌ Было:
if (isAdmin) {
grantAccess();
} else {
denyAccess();
}
✔️ Стало:
if (!isAdmin) {
denyAccess();
return;
}
grantAccess();
Меньше вложенности → легче читать.
👍 3. Меньше булевых флагов
❌ Неочевидно:
public void start(boolean silent) {
if (!silent) {
System.out.println("Starting...");
}
// ...
}
✔️ Читаемо:
public void startLoud() {
System.out.println("Starting...");
start();
}
public void start() {
// ...
}
Выноси поведение в отдельные методы, а не в булевы флаги.
👍 4. Используй Optional вместо null
❌ Потенциальный NPE:
String name = user.getName();
✔️ Безопаснее:
Optional<String> name = user.getNameOptional();
name.ifPresent(System.out::println);
Optional показывает, что значение может отсутствовать.
👍 5. Выражай намерение через enum
❌ Магические числа:
send(2);
✔️ Ясно:
send(Priority.HIGH);
enum передаёт смысл.
👍 6. Строим объекты читаемо: builder
❌ Плохо читается:
User u = new User("Ann", 25, true, "Russia", null, false);
✔️ Круто:
User user = User.builder()
.name("Ann")
.age(25)
.active(true)
.country("Russia")
.build();
Именованные параметры через builder — читабельность x10.
👍 7. Используй switch-expression в Java 14+
❌ Старый подход:
int days;
switch (month) {
case JANUARY: days = 31; break;
case FEBRUARY: days = 28; break;
// ...
}
✔️ Современный:
int days = switch (month) {
case JANUARY, MARCH, MAY -> 31;
case FEBRUARY -> 28;
default -> throw new IllegalArgumentException();
};
Чётко, лаконично, без лишнего кода.
👍 8. Чистые методы = маленькие и простые
❌ Монстр:
public void registerUser(UserDto dto) {
validate(dto);
saveToDatabase(dto);
sendWelcomeEmail(dto);
logRegistration(dto);
}
✔️ Разбиваем:
public void registerUser(UserDto dto) {
validate(dto);
persist(dto);
notify(dto);
}
private void validate(UserDto dto) { ... }
private void persist(UserDto dto) { ... }
private void notify(UserDto dto) { ... }
Каждый метод делает одну вещь. Легко тестировать, легко читать.
👍 9. Предпочитай Streams + map/filter/collect
❌ Старый for:
List<String> active = new ArrayList<>();
for (User u : users) {
if (u.isActive()) {
active.add(u.getName().toUpperCase());
}
}
✔️ Современно:
List<String> active = users.stream()
.filter(User::isActive)
.map(u -> u.getName().toUpperCase())
.collect(Collectors.toList());
Чисто, выразительно, без шума.
👍 10. Старайся не ловить Exception без причины
❌ Так себе:
try {
Thread.sleep(100);
} catch (Exception e) {
// игнорируем
}
✔️ Так лучше:
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException(e);
}
Нельзя просто проглатывать ошибки — это превращается в хаос.
🗣️ Запомни:
Clean code — это не строгость, а удобство.
Читаемый код — это код, который ты поймёшь через 3 месяца в 2 часа ночи.
Не бойся переписывать, выносить, называть по-человечески — в этом сила Java-разработчика.6 815
Онлайн-доски теперь в Битрикс24
Можно не только вести проекты и общаться по видео, но и визуализировать идеи вместе с командой. Бесплатно, удобно, без лишних движений. Стратегии больше не будут прежними.
Зарегистрироваться
#реклама 16+
bitrix24.ru
О рекламодателе
