Java | Фишки и трюки
رفتن به کانال در Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
نمایش بیشتر6 954
مشترکین
-124 ساعت
-117 روز
+1330 روز
آرشیو پست ها
6 955
⌨️ Может ли статический метод быть переопределён?
В Java статические методы нельзя переопределить в строгом смысле этого слова, поскольку они связаны с классом, а не с объектом. Однако их можно скрыть (hide).
Если в подклассе объявить статический метод с той же сигнатурой, что и в суперклассе, то метод суперкласса будет скрыт в контексте подкласса.
Такое скрытие не является переопределением, потому что оно не зависит от объекта, а определяется на уровне класса.
Если вы вызываете статический метод через ссылку на суперкласс, будет вызван метод суперкласса, независимо от того, какой класс был фактически использован для создания объекта.
Пример:
class Parent {
static void staticMethod() {
System.out.println("Parent");
}
}
class Child extends Parent {
static void staticMethod() {
System.out.println("Child");
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Child();
parent.staticMethod(); // Parent
}
}
Почему статические методы нельзя переопределить?
Переопределение в Java работает через механизм динамической диспетчеризации, который зависит от объекта, а не от класса. Поскольку статические методы вызываются на уровне класса, такой механизм для них неприменим.
#java #static #override6 955
🚩 Красные флаги на собесе
или почему ты опять не получил оффер
- не умеешь говорить о зарплате
- не знаешь, как представить предыдущий опыт
- не можешь рассказать о своих сильных сторонах
В итоге - HR так и не узнал о твоих удачных проектах, собес провален, на вакансии откликаться страшно.
Чтобы это не было твоей историей, приходи на лекцию от команды FAANG School
Что тебя ждет:
- увидишь, как HR собеседует программиста в прямом эфире
- поймешь, как отвечать на неудобные вопросы про зарплату
- разберешь частые ошибки начинающих на собесах
- научишься представлять предыдущий опыт
- узнаешь, как говорить о своих сильных сторонах без пафоса
- поймешь, что нужно спросить у HR, чтобы понять уровень компании
Приходи на эфир и получи пошаговый план подготовки к каждому этапу интервью. Исправь ошибки на собесе, чтобы HR выстроились в очередь.
6 955
⌨️ Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс?
✔️ В Java класс может одновременно реализовать несколько интерфейсов, но наследоваться только от одного класса.
✔️ Абстрактные классы используются только тогда, когда присутствует тип отношений «is a» (является). Интерфейсы могут реализоваться классами, которые не связаны друг с другом.
✔️ Абстрактный класс - средство, позволяющее избежать написания повторяющегося кода, инструмент для частичной реализации поведения. Интерфейс - это средство выражения семантики класса, контракт, описывающий возможности. Все методы интерфейса неявно объявляются как
public abstract или (начиная с Java 8) default - методами с реализацией по-умолчанию, а поля - public static final.
✔️ Интерфейсы позволяют создавать структуры типов без иерархии.
✔️ Наследуясь от абстрактного, класс «растворяет» собственную индивидуальность. Реализуя интерфейс, он расширяет собственную функциональность.
Абстрактные классы содержат частичную реализацию, которая дополняется или расширяется в подклассах. При этом все подклассы схожи между собой в части реализации, унаследованной от абстрактного класса, и отличаются лишь в части собственной реализации абстрактных методов родителя. Поэтому абстрактные классы применяются в случае построения иерархии однотипных, очень похожих друг на друга классов. В этом случае наследование от абстрактного класса, реализующего поведение объекта по умолчанию может быть полезно, так как позволяет избежать написания повторяющегося кода. Во всех остальных случаях лучше использовать интерфейсы.
#java #interface #abstract6 955
Онлайн-курс «Java-разработчик» от EdMe: 6-8 месяцев, гарантия получения работы, оплата обучения после трудоустройства
Образовательный проект EdMe открывает набор на курс по Java-разработке, который стартует в январе. Новый год — идеальный момент, чтобы выполнить обещания себе и сделать шаг к новой профессии!
Обучение построено на менторстве и направлено на комплексную подготовку к трудоустройству. Программа подойдет для начинающих и тех, кто хочет улучшить свои навыки. За 6-8 месяцев вы сможете достичь уровня middle, для этого нужно уделять обучению от 20 часов в неделю.
Вы будете взаимодействовать с опытным разработчиком, который объяснит, что нужно учить и как это делать, а также чего избегать, чтобы быстрее освоить необходимые навыки и получить оффер. Ментор будет направлять вас, советовать, как решать технические вопросы, и помогать готовиться к собеседованиям.
Плюсы курса:
➕Гарантированное трудоустройство с зарплатой от 140 000 рублей.
➕Оплата после выхода на работу: вы платите только 20% от зарплаты в течение 18 месяцев.
➕Карьерная поддержка даже после окончания курса.
➕Если по каким-то причинам вы не сможете завершить обучение, это можно сделать без оплаты.
Во время обучения вы будете использовать Jira, Confluence, Bitbucket, GitLab – те самые системы, которые станут вашими рабочими инструментами в IT-компаниях.
Программа курса:
▪️Основы Java: Java Core, List, JDBC, Hibernate, Spring (Core, MVC, Security), Spring Boot, Git
▪️Проект
▪️Подготовка к собеседованиям (составление резюме, прохождение тестовых собеседований)
▪️Прохождение реальных собеседований
🖋 Узнать подробности и записаться на курс «Java-разработчик» можно на EdMe.pro
Отбор включает тестовое задание, которое под силу выполнить человеку без опыта, и собеседование.
Реклама. ООО "БАКСЭТ", ИНН 4345115602. Erid 2VtzqxXev2F
6 955
🚀 Ускорение загрузки через AOT Compilation
AOT (Ahead-Of-Time) Compilation — это технология, которая позволяет компилировать байт-код Java в нативный код до его запуска. Это может значительно ускорить время загрузки приложения, так как исключает необходимость выполнения JIT-компиляции в процессе работы.
🔍 Зачем использовать AOT Compilation?
1️⃣ Ускорение старта приложения — уменьшение времени запуска за счет заранее скомпилированных частей программы.
2️⃣ Понижение нагрузки на JVM — выполнение всех операций компиляции до старта приложения, что снижает потребление ресурсов во время выполнения.
3️⃣ Использование нативного кода — AOT позволяет использовать преимущества более быстрого выполнения нативного кода вместо байт-кода.
📌 Как включить AOT Compilation?
1️⃣ Скомпилируйте класс с помощью
javac в обычный байт-код.
2️⃣ Примените инструмент jaotc (Java AOT Compiler) для компиляции байт-кода в нативный код.
3️⃣ Запустите приложение с использованием скомпилированных AOT-артефактов.
📌 Пример использования AOT Compilation:
1. Компиляция классов с помощью javac:
javac MyApp.java
2. Генерация AOT-артефактов с помощью jaotc:
jaotc --output libMyApp.aot MyApp.class
3. Запуск приложения с AOT:
java -XX:AOTLibrary=libMyApp.aot -cp . MyApp
🔗 Особенности AOT Compilation:
1️⃣ AOT-компиляция доступна начиная с Java 9.
2️⃣ Используется для ускорения старта приложения, особенно для больших и сложных систем.
3️⃣ Не все Java-библиотеки могут быть компилированы с использованием AOT, особенно те, которые активно используют Reflection или динамическую загрузку классов.
💡 Совет: AOT лучше всего работает в приложениях, где известен весь набор классов и методов, которые будут использоваться. В случаях с динамическими зависимостями может быть ограничена эффективность.
#Java #AOTCompilation #Performance #Java96 955
🚀 Секреты работы с VarHandle и как они могут заменить рефлексию
VarHandle — это "новый" API, введённый в Java 9, который предоставляет низкоуровневый доступ к переменным (поля, массивы и элементы) в многопоточной среде. Он является более производительным и безопасным способом работы с полями, чем традиционная рефлексия.
🔍 Зачем использовать VarHandle вместо рефлексии?
1️⃣ Производительность — VarHandle предоставляет прямой доступ к полям и переменным, минуя накладные расходы, которые присущи рефлексии.
2️⃣ Поддержка атомарных операций — VarHandle поддерживает атомарные операции, такие как чтение и запись, что полезно в многозадачности.
3️⃣ Типобезопасность — в отличие от рефлексии, VarHandle является типобезопасным, что уменьшает количество ошибок при компиляции.
📌 Как использовать VarHandle?
1️⃣ Используйте метод VarHandles.lookup() для получения экземпляра VarHandle.
2️⃣ Используйте его для чтения и записи значений в поля объектов.
3️⃣ Поддерживает операции, такие как get(), set(), а также атомарные операции.
📌 Пример использования VarHandle:
import java.lang.invoke.*;
public class VarHandleExample {
private String field = "Initial Value";
public static void main(String[] args) throws Throwable {
VarHandleExample example = new VarHandleExample();
VarHandle varHandle = MethodHandles.lookup().findVarHandle(VarHandleExample.class, "field", String.class);
// Чтение значения через VarHandle
System.out.println("Current value: " + varHandle.get(example));
// Изменение значения через VarHandle
varHandle.set(example, "Updated Value");
System.out.println("Updated value: " + varHandle.get(example));
// Атомарное обновление значения
boolean success = varHandle.compareAndSet(example, "Updated Value", "New Value");
System.out.println("Atomic update successful: " + success);
System.out.println("Final value: " + varHandle.get(example));
}
}
✨ Когда использовать VarHandle вместо рефлексии?
- Когда необходимо работать с полями объектов или массивами без накладных расходов рефлексии.
- Для оптимизации производительности в многозадачных приложениях.
- Когда нужно обеспечить типобезопасность и атомарность операций при работе с полями.
#Java #VarHandle #Reflection #Concurrency #Performance6 955
⌨️ Инструменты рефлексии для работы с приватными полями
Reflection позволяет работать с приватными полями и методами в Java, обходя модификаторы доступа. Это мощный инструмент, который нужно использовать с осторожностью, чтобы избежать проблем с безопасностью и производительностью.
📌 Пример: доступ к приватному полю
import java.lang.reflect.Field;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// Класс с приватным полем
class Person {
private String name = "John Doe";
}
// Создаём объект
Person person = new Person();
// Получаем поле через Reflection
Field field = Person.class.getDeclaredField("name");
field.setAccessible(true); // Делаем поле доступным
// Читаем значение приватного поля
String name = (String) field.get(person);
System.out.println("Имя до изменения: " + name);
// Изменяем значение поля
field.set(person, "Alice");
System.out.println("Имя после изменения: " + field.get(person));
}
}
🔗 Как работает:
1️⃣ getDeclaredField получает доступ к приватному полю.
2️⃣ setAccessible(true) отключает проверку модификаторов доступа.
3️⃣ С помощью get и set мы читаем и изменяем значение поля.
📌 Доступ к приватным полям через MethodHandles
MethodHandles также позволяют работать с приватными полями, но более безопасно:
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
public class VarHandleExample {
public static void main(String[] args) throws Throwable {
class Person {
private String name = "John Doe";
}
Person person = new Person();
// Получаем VarHandle для поля name
VarHandle varHandle = MethodHandles.privateLookupIn(Person.class, MethodHandles.lookup())
.findVarHandle(Person.class, "name", String.class);
// Читаем значение поля
System.out.println("Имя до изменения: " + varHandle.get(person));
// Изменяем значение
varHandle.set(person, "Alice");
System.out.println("Имя после изменения: " + varHandle.get(person));
}
}
🔗 Как работает:
1️⃣ MethodHandles.privateLookupIn позволяет получить доступ к приватному полю.
2️⃣ findVarHandle создаёт безопасный VarHandle для работы с полем.
3️⃣ get и set работают аналогично традиционной рефлексии, но более эффективно.
✨ Когда использовать рефлексию для приватных полей?
- Для инструментов, которые требуют динамического анализа или изменения классов.
- В тестировании для проверки внутренних состояний объектов.
💡 Совет: Используйте рефлексию ответственно, так как она может нарушать инкапсуляцию и снижать производительность. Если есть возможность, замените её на более безопасные подходы.
#Java #Reflection6 955
📌1️⃣2️⃣3️⃣4️⃣Совет на 2025 год — как стать программистом за две недели!
В телеграмм появился канал в котором бесплатно слили весь топовый контент о программировании! Любой материал, всё разбито по хэш-тэгу в закрепе:
📱 Frontend 👩💻 C++
📱 Python 🤔 Hacking
📱 Java 👩💻 Golang
📱 C# 👩💻 Linux
👩💻 Lua 👩💻 php
👩💻 Kotlin 👩💻 Git
👩💻 Assembler 👩💻 Swift
🖥 SQL 👩💻 Mob. Develop
👣 Backend 🐞 Qa Automation
🖥 Arduino 🖥 Desing
Успей подписаться❗️ @CodHub_tg
6 955
🖥 Parallel Streams: когда это действительно ускоряет
Parallel Streams — это мощный инструмент в Java, который позволяет выполнять операции со стримами параллельно, используя несколько потоков. Однако параллельность не всегда улучшает производительность.
📌 Когда Parallel Streams полезны:
1️⃣ Большие объёмы данных. При обработке сотен тысяч или миллионов элементов параллельность помогает распределить нагрузку.
2️⃣ Тяжёлые вычисления. Если каждая операция над элементом занимает значительное время.
3️⃣ Многоядерные процессоры. Выигрыш заметен, если система поддерживает многопоточность.
📌 Пример: подсчёт простых чисел параллельно
import java.util.stream.LongStream;
public class ParallelStreamExample {
public static void main(String[] args) {
long start = System.currentTimeMillis();
// Подсчёт простых чисел от 1 до 10_000_000
long count = LongStream.rangeClosed(1, 10_000_000)
.parallel() // Параллельный стрим
.filter(ParallelStreamExample::isPrime)
.count();
long end = System.currentTimeMillis();
System.out.println("Количество простых чисел: " + count);
System.out.println("Время выполнения: " + (end - start) + " мс");
}
private static boolean isPrime(long n) {
if (n <= 1) return false;
for (long i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
}
🔗 Что делает код:
1️⃣ Параллельный стрим (parallel) делит диапазон на подзадачи.
2️⃣ Функция isPrime проверяет, является ли число простым.
3️⃣ Элементы обрабатываются в нескольких потоках.
📌 Когда НЕ стоит использовать Parallel Streams:
✔️ Небольшие объёмы данных. Создание потоков может занять больше времени, чем выполнение задачи.
✔️ Лёгкие операции. Например, простое суммирование чисел.
✔️ Синхронизация или shared-state. Параллельные операции, изменяющие общий объект, могут привести к ошибкам.
✨ Совет: Перед использованием параллельных стримов измерьте производительность и убедитесь, что прирост скорости оправдывает сложность.
#Java #Streams #ParallelStreams #Оптимизация6 955
Короче, ищем менторов — Middle и Senior Java-разработчиков
Ищем в ШОРТКАТ — менторскую платформу от команды разработчиков из бигтеха. Мы помогаем найти крутую работу, апнуть грейд или сменить стек.
Что надо будет делать: проводить тестовые собесы → оценивать грейд → помогать разбираться в сложных темах.
Что взамен:
• От 40К за 5-7 часов работы в неделю
• Доступ к обучению и комьюнити сильных менторов из Booking, Сбер, Oracle, Tinkoff
• Возможность выступать на эфирах, куда уже приходят 500+ джавистов, и стать заметнее на рынке
Заполняй форму — свяжемся и расскажем подробности ➡️ https://forms.gle/rFY9z9GKggqfgSS76
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqvZyMYF
6 955
⌨️ Анализ производительности через Java Flight Recorder (JFR)
Java Flight Recorder (JFR) — мощный инструмент для мониторинга и анализа работы приложений на JVM. Он позволяет выявлять узкие места производительности, управлять ресурсами и находить проблемы в реальном времени.
📌 Особенности JFR:
1️⃣ Сбор подробной информации о работе JVM: GC, использование потоков, IO, задержки.
2️⃣ Минимальная нагрузка на приложение во время работы.
3️⃣ Удобная интеграция с инструментами анализа, такими как Java Mission Control.
📌 Основные сценарии использования:
✔️ Диагностика задержек и утечек памяти.
✔️ Мониторинг производительности потоков и GC.
✔️ Отслеживание аномалий в нагрузке или пропускной способности.
📌 Как включить JFR:
1️⃣ При запуске приложения:
java -XX:StartFlightRecording=name=MyApp,filename=recording.jfr
2️⃣ Запуск с указанием продолжительности записи:
java -XX:StartFlightRecording=duration=60s,filename=recording.jfr
3️⃣ Анализ файла recording.jfr через Java Mission Control (JMC).
💡 Совет: JFR встроен в JDK 11+ и не требует дополнительных установок. Используйте его для быстрого анализа проблем и повышения производительности.
#Java #JFR #Производительность #Оптимизация6 955
⌨️ Memory-mapped buffer: эффективная работа с файлами
Memory-mapped buffer — это механизм, предоставляемый Java NIO, который позволяет отображать файл в памяти, так что его содержимое становится доступным для чтения и записи как массив байтов. Это позволяет работать с файлами напрямую через память, что часто значительно увеличивает производительность операций ввода-вывода (I/O).
🔍 Почему это быстрее?
1️⃣ Файл загружается в память через виртуальную память ОС.
2️⃣ Операции чтения/записи проходят без необходимости копирования данных между потоками.
3️⃣ Доступ к данным осуществляется так же, как и в обычном массиве.
📌 Пример чтения файла:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class MemoryMappedBufferExample {
public static void main(String[] args) throws IOException {
try (RandomAccessFile file = new RandomAccessFile("example.txt", "r");
FileChannel channel = file.getChannel()) {
// Сопоставляем файл с памятью
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
// Читаем данные из буфера
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
}
}
}
🔗 Ключевые моменты:
1️⃣ Режимы READ_ONLY, READ_WRITE, PRIVATE определяют доступ к файлу.
2️⃣ Объём сопоставления ограничен размером доступной памяти.
3️⃣ Подходит для работы с большими файлами (до гигабайтов).
✨ Когда использовать?
- Для высокопроизводительного чтения/записи данных.
- При обработке больших логов или бинарных файлов.
- Когда нужно работать с файлами как с массивами.
#Java #MemoryMappedBuffer #nio6 955
⌨️ WatchService: мониторинг изменений файловой системы
WatchService из java.nio.file — это инструмент для отслеживания изменений в файловой системе. С его помощью можно отслеживать создание, изменение и удаление файлов или папок в указанном каталоге.
🔍 Почему WatchService?
1️⃣ Лёгкий способ мониторинга изменений без ручных проверок.
2️⃣ Эффективно работает в реальном времени.
3️⃣ Удобно для отслеживания логов, конфигурационных файлов или загрузок.
📌 Пример использования:
import java.io.IOException;
import java.nio.file.*;
public class WatchServiceExample {
public static void main(String[] args) throws IOException, InterruptedException {
Path path = Paths.get("watched_directory");
// Создаём WatchService
try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
// Регистрируем каталог для мониторинга
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
System.out.println("Мониторинг изменений в каталоге: " + path);
while (true) {
WatchKey key = watchService.take(); // Блокирует поток до события
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent.Kind<?> kind = event.kind();
Path fileName = (Path) event.context();
System.out.println("Событие: " + kind + " для файла: " + fileName);
}
// Сбрасываем ключ, чтобы продолжать мониторинг
boolean valid = key.reset();
if (!valid) {
break; // Если ключ недействителен, выходим из цикла
}
}
}
}
}
🔗 Как это работает:
1️⃣ Регистрируйте каталог с указанием типов событий (ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE).
2️⃣ Обрабатывайте события через WatchKey и список pollEvents().
3️⃣ Вызывайте key.reset() после обработки событий, чтобы продолжить мониторинг.
💡 Совет: Убедитесь, что ваш код учитывает, что WatchService отслеживает только верхний уровень каталога (не вложенные папки).
#Java #WatchService #nio6 955
Новогодний список: елка, мандарины и карьерный рост! 🎇
Новый год — шанс стать лучшей версией себя. Как раз для этого и создан бесплатный онлайн-интенсив в Открытых школах Т1 для Java-разработчиков с опытом от года.
За месяц ты сможешь поднять свои скилы на новый уровень и познакомиться с ИТ-холдингом Т1, а после — принять участие в offer weeks.
⌛️ Быстрое обучение: 1 месяц.
💻 Гибкий формат: все этапы проходят онлайн, занятия — по вечерам.
Почему в Т1 классно?
🔹Уникальный рыночный опыт и масштабные ИТ-проекты для ключевых отраслей экономики. Разработки Т1 ежегодно получают награды на ИТ-конкурсах: Global CIO, Национальной банковской премии и других.
🔹Быстрый рост в ИТ при экспертной поддержке. Карьерные треки для выпускников Открытых школ позволяют быстро расти в профессии.
🔹Бигтех-культура и айтишные бонусы: ИТ-аккредитация, современный техстек, ДМС, удаленка, крутые офисы, спорт, обучение, ИТ-конференции, программы признания и развития и многое другое от Т1.
Подай заявку на интенсив до 14.01, и пусть 2025 принесёт тебе не только подарки, но и карьерный рост!
Реклама. ООО «Т1» ИНН: 7720484492. Erid: 2SDnjdedeLK
6 955
💡 Immutable Objects: зачем они нужны и как их создавать
Неизменяемые объекты (Immutable Objects) — это объекты, состояние которых невозможно изменить после создания. Они широко используются в Java для обеспечения безопасности, удобства работы в многопоточной среде и упрощения кода.
🔍 Зачем использовать Immutable объекты?
1️⃣ Безопасность данных: их невозможно изменить, что предотвращает случайное или преднамеренное изменение состояния.
2️⃣ Многопоточность: безопасны для использования без синхронизации.
3️⃣ Простота: отсутствует необходимость отслеживать изменения или управлять состоянием.
📌 Как создать Immutable объект:
1️⃣ Сделайте класс
final.
2️⃣ Объявите все поля private и final.
3️⃣ Исключите сеттеры.
4️⃣ Предоставьте только геттеры (без возможности изменения данных).
5️⃣ Обеспечьте глубокое копирование для изменяемых полей.
📌 Пример Immutable класса:
public final class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
🔗 Особенности реализации:
1️⃣ Класс ImmutablePerson нельзя унаследовать (final).
2️⃣ Поля name и age нельзя изменить после инициализации.
3️⃣ Нет методов для изменения полей (сеттеров).
📌 Работа с изменяемыми полями:
Если ваш класс содержит изменяемые объекты, возвращайте их копию или неизменяемую обёртку:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public final class ImmutableClass {
private final List<String> items;
public ImmutableClass(List<String> items) {
this.items = new ArrayList<>(items); // Создаём копию
}
public List<String> getItems() {
return Collections.unmodifiableList(items); // Возвращаем неизменяемую копию
}
}
💡В Java есть встроенные immutable классы, такие как String, Integer, LocalDate и другие. Используйте их, когда это возможно.
#Java #Immutable6 955
⌨️ Record: минимализм с максимальной пользой
Record — это компактный способ создания классов для хранения данных. Они появились в Java 16 и позволяют минимизировать код, генерируя за вас:
- Конструктор,
- Геттеры,
- Методы
toString, equals и hashCode.
📌 Пример создания Record:
public record Person(String name, int age) { }
Этот код создаёт immutable класс с полями name и age. Использовать его просто:
Person person = new Person("Alice", 25);
System.out.println(person.name()); // Alice
System.out.println(person); // Person[name=Alice, age=25]
🔗 Особенности Record:
1️⃣ Поля всегда final и неизменяемы.
2️⃣ Record нельзя наследовать или быть родителем.
3️⃣ Можно добавлять свои методы и проверки.
📌 Пример добавления логики:
public record Person(String name, int age) {
public Person {
if (age < 0) {
throw new IllegalArgumentException("Возраст не может быть отрицательным.");
}
}
}
✨ Когда использовать?
- DTO, VO, ключи в коллекциях, и везде, где важна простота и неизменяемость.
#Java #record6 955
⌨️ Создание классов на лету через ASM
ASM — мощная библиотека для работы с байт-кодом, позволяющая генерировать классы на лету. Это инструмент низкого уровня для полной работы с JVM-классами.
📌 Пример создания класса "Greeter" с методом `greet`:
import org.objectweb.asm.*;
import static org.objectweb.asm.Opcodes.*;
public class ASMExample {
public static void main(String[] args) throws Exception {
// Создаём ClassWriter
ClassWriter cw = new ClassWriter(0);
cw.visit(V1_8, ACC_PUBLIC, "Greeter", null, "java/lang/Object", null);
// Генерируем метод greet()
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "greet", "()V", null, null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitLdcInsn("Привет, ASM!");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
mv.visitInsn(RETURN);
mv.visitMaxs(2, 0);
mv.visitEnd();
cw.visitEnd();
// Загружаем класс
byte[] classBytes = cw.toByteArray();
ClassLoader loader = new ClassLoader() {
public Class<?> defineClass(String name, byte[] b) {
return super.defineClass(name, b, 0, b.length);
}
};
Class<?> greeterClass = loader.defineClass("Greeter", classBytes);
// Вызываем метод greet
greeterClass.getMethod("greet").invoke(null);
}
}
🔗 Как работает:
1️⃣ Генерируется класс Greeter.
2️⃣ Метод greet выводит строку "Привет, ASM!".
3️⃣ Загружается и выполняется новый класс через кастомный ClassLoader.
✨ Когда использовать ASM?
- Для динамического создания классов или методов.
- В инструментах профилирования или анализа.
- Для оптимизации байт-кода в runtime.
💡 Совет: ASM даёт полный контроль над байт-кодом, но для большинства задач лучше использовать более высокоуровневые инструменты, такие как ByteBuddy или Javassist.
#Java #ASM
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
