

- Главная
- Каталог
- Интернет технологии
- Java | Фишки и трюки

Java | Фишки и трюки
Аудитория канала - начинающие или опытные Java программисты. Канал о разработке приложений на Java, в том числе написание бэкенд и web-приложений. Рассматриваются фишки и трюки при программировании на Java.
Статистика канала
Полная статистикаchevron_rightmodule-info.java
module com.example.app {
requires com.example.service;
exports com.example.app.api;
}{}
➡️ Файл module-info.java
лежит в корне src/com.example.app
и описывает, какие модули нужны (requires
) и какие пакеты доступны наружу (exports
). Всё остальное скрыто.
🔒 Инкапсуляция пакетов
module com.example.service {
exports com.example.service.api;
// внутренние классы не экспортируются
}{}
➡️Код внутри модуля по умолчанию недоступен извне. Это защита от случайного использования «внутренних» API.
🔗 Транзитивные зависимости
module com.example.web {
requires transitive com.example.service;
}{}
➡️ Если модуль A
требует B
как transitive
, то любой, кто подключает A
, автоматически получает доступ к B
.
🧩 Пример: приложение из трёх модулей
com.example.model → только данные
com.example.service → бизнес-логика
com.example.app → точка входа{}
➡️ Модули явно описывают связи. Код не сможет обратиться к тому, что не экспортировано.
⚠️ Ошибка при неправильной зависимости
module com.example.model {
// ничего не экспортирует
}
module com.example.app {
requires com.example.model;
}{}
➡️ Компилятор выдаст ошибку: package ... is not visible
. Нужно явно exports
.
🚦 Сравнение с классическим classpath
👍 classpath: всё видно всем, легко словить «spaghetti» зависимостей. 👍 modules: строгие границы, меньше сюрпризов при рефакторинге.🔧 Совместимость и migration
🔴 Старые JAR можно подключать через automatic modules. 🔴 Постепенно можно переносить проект на полноценные модули.🗣️ Запомни: JPMS — это не только про разбиение проекта, но и про контроль связей. Модули делают систему чище, безопаснее и помогают строить большие приложения без хаоса зависимостей.
В этом видео автор подробно разбирает, как создавать и использовать функции (методы) в Java. Пошагово объясняется, как объявлять методы, передавать параметры, возвращать значения и вызывать их из других частей программы.🤩 Java Фишки и трюки || #Видео
default
:
interface Example {
int process(int a);
default void show() {
System.out.println("default show()");
}
}{}
✔️Если класс реализует интерфейс, он может, но не обязан, реализовать методы по-умолчанию, уже реализованные в интерфейсе. Класс наследует реализацию по умолчанию.
✔️Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно. Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным - никакой реализации по умолчанию классом не наследуется.
✔️Метод по умолчанию не может переопределить метод класса java.lang.Object
.
✔️Помогают реализовывать интерфейсы без страха нарушить работу других классов.
✔️Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах.
✔️Дают свободу классам выбрать метод, который нужно переопределить.
✔️Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения.
Вызывать default
метод интерфейса в реализующем этот интерфейс классе можно используя ключевое слово super
вместе с именем интерфейса:
interface Paper {
default void show() {
System.out.println("default show()");
}
}
class Licence implements Paper {
public void show() {
Paper.super.show();
}
}{}
byte
(длина 1 байт) к типу int
(длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически.
✔️ Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int
было больше 127, то при приведении его к byte
значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится.
✔️ Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически.
✔️ Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException
. Требует явного указания типа.
✔️ Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String
.
✔️ Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п.
При приведении ссылочных типов с самим объектом ничего не происходит, - меняется лишь тип ссылки, через которую происходит обращение к объекту.
Для проверки возможности приведения нужно воспользоваться оператором instanceof
:
Parent parent = new Child();
if (parent instanceof Child) {
Child child = (Child) parent;
}
{}
#java #casting #upcasting #downcasting
Thread thread = new Thread(() -> {
System.out.println("Hello from thread!");
});
thread.start();{}
➡️ Потоки живут в ОС. Их немного, и каждый ест память и ресурсы.
⚡️ Новый способ — виртуальные потоки
Thread vThread = Thread.ofVirtual().start(() -> {
System.out.println("Hello from virtual thread!");
});{}
➡️ Здесь поток лёгкий. Java сама маппит тысячи виртуальных потоков на несколько системных.
🔄 Масштаб без боли
for (int i = 0; i < 1_000_000; i++) {
Thread.ofVirtual().start(() -> work());
}{}
➡️ Миллион потоков без OutOfMemoryError
. На обычных тредах — краш.
⏸️ Блокировка без страха
Thread.ofVirtual().start(() -> {
Thread.sleep(1000); // блокируемся
System.out.println("Done!");
});{}
➡️ Виртуальные треды спокойно блокируются. JVM паркует их, освобождая ресурсы.
🌐 Асинхронщина без Future/CompletableFuture
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> fetchFromApi());
executor.submit(() -> readFromDb());
}{}
➡️ Каждая задача — в своём виртуальном треде. Асинхронность пишется синхронно.
🔧 Работа с I/O
Files.lines(Path.of("data.txt"))
.forEach(line -> System.out.println(line));{}
➡️ Даже блокирующее I/O больше не страшно. В Loom оно «кажется» блокирующим, но реально не тормозит.
📊 Где использовать
🟢 сетевые сервисы (много коннектов); 🟢 микросервисы; 🟢 парсеры/скрейперы; 🟢 всё, где тысячи одновременных задач.🗣️ Запомни: Про «тредпулы и колбэки» скоро можно будет забыть.
Integer a = 128;
Integer b = 128;
System.out.println(a == b); // false
Integer x = 1;
Integer y = 1;
System.out.println(x == y); // true
{}
Это не просто волшебство! Это связано с целочисленным кэшированием в Java.
Для значений в диапазоне от -128 до 127 объекты типа Integer
кэшируются, и ссылки на них одинаковы, а для значений за пределами этого диапазона создаются новые объекты, и ссылки на них будут разными. Так как используется оператор ==
, то сравниваются ссылки на объекты.
#java #magicСтатистика
Отзывы канала
всего 10 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Java | Фишки и трюки — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 7.4K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 21.8, количество отзывов – 10, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 2237.76 ₽, а за 81 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий