Java | Фишки и трюки
الذهاب إلى القناة على Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg
إظهار المزيد6 681
المشتركون
-624 ساعات
-227 أيام
-6730 أيام
أرشيف المشاركات
6 680
⌨️ Виды классов
1. Обычные классы (Regular Classes)
Это наиболее распространенные классы, которые вы создаете для определения объектов. Они могут содержать поля, методы, конструкторы и вложенные классы.
public class MyClass {
private int field;
public MyClass(int field) {
this.field = field;
}
public void method() {
// some code
}
}
2. Абстрактные классы (Abstract Classes)
Абстрактные классы не могут быть созданы как объекты напрямую. Они предназначены для предоставления общей функциональности, которую подклассы должны реализовать или дополнить.
public abstract class AbstractClass {
public abstract void abstractMethod();
public void concreteMethod() {
// some code
}
}
3. Вложенные классы (Nested Classes)
Классы, объявленные внутри другого класса. Они могут быть статическими или нестатическими.
🔹 Статические вложенные классы (Static Nested Classes):
Эти классы могут быть созданы без экземпляра внешнего класса.
public class OuterClass {
static class StaticNestedClass {
// some code
}
}
🔹 Внутренние классы (Inner Classes):
Эти классы имеют доступ ко всем членам внешнего класса и создаются в контексте экземпляра внешнего класса.
public class OuterClass {
class InnerClass {
// some code
}
}
4. Локальные классы (Local Classes)
Классы, объявленные внутри метода, конструктора или блока. Они имеют доступ к финальным переменным из охватывающего метода.
public class OuterClass {
public void method() {
class LocalClass {
// some code
}
LocalClass local = new LocalClass();
}
}
5. Анонимные классы (Anonymous Classes)
Классы без имени, создаваемые на месте для реализации интерфейса или наследования от класса. Часто используются для создания экземпляров интерфейсов или абстрактных классов.
public class OuterClass {
public void method() {
Runnable runnable = new Runnable() {
@Override
public void run() {
// some code
}
};
}
}
6. Перечисления (Enums)
Специальные классы, представляющие набор констант. Они могут содержать поля, методы и конструкторы.
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
7. Интерфейсы (Interfaces)
Технически не классы, но важная часть объектно-ориентированного программирования в Java. Интерфейсы определяют контракты, которые должны быть реализованы классами.
public interface MyInterface {
void myMethod();
}
8. Записи (Records)
Нововведение в Java 14 (в предварительном виде) и официально в Java 16. Они предоставляют компактный способ создания неизменяемых классов с полями и автоматически сгенерированными методами, такими как equals, hashCode и toString.
public record Point(int x, int y) {}
#java #classes6 680
☕️ Java в потоке данных: Flink, Beam и Spark без магии
Когда данные бегут нескончаемым потоком, а твой монолит не успевает считать, Java превращается в машину для real-time-аналитики.
Flink, Beam и Spark — три пути к масштабным потоковым системам. Ни теории — только код.
💀 Обычный подход — всё тормозит
List<String> lines = Files.readAllLines(Paths.get("data.txt"));
Map<String, Long> counts = lines.stream()
.flatMap(line -> Arrays.stream(line.split(" ")))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(counts);
➡️ Всё в память, всё синхронно. Умер на первом гигабайте.
⚙️ Flink — потоковые вычисления без задержек
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> stream = env.socketTextStream("localhost", 9999);
stream
.flatMap((String line, Collector<String> out) -> {
for (String word : line.split(" ")) out.collect(word);
})
.keyBy(word -> word)
.sum(1)
.print();
env.execute("Flink WordCount");
✅ Реактивная обработка, fault tolerance и state — всё из коробки.
🧩 Spark Structured Streaming — SQL на лету
SparkSession spark = SparkSession.builder().appName("StreamSQL").getOrCreate();
Dataset<Row> lines = spark.readStream()
.format("socket")
.option("host", "localhost")
.option("port", 9999)
.load();
Dataset<Row> words = lines.as(Encoders.STRING())
.flatMap((FlatMapFunction<String, String>) x -> Arrays.asList(x.split(" ")).iterator(), Encoders.STRING());
words.groupBy("value").count()
.writeStream()
.outputMode("complete")
.format("console")
.start()
.awaitTermination();
✅ DataFrame API + реальное время. SQL-запросы к стримам — это норма.
🧠 Beam — пиши один раз, запускай где угодно
Pipeline p = Pipeline.create();
p.apply(TextIO.read().from("input.txt"))
.apply(ParDo.of(new DoFn<String, String>() {
@ProcessElement
public void processElement(ProcessContext c) {
for (String word : c.element().split(" ")) c.output(word);
}
}))
.apply(Count.perElement())
.apply(TextIO.write().to("output"));
p.run().waitUntilFinish();
✅ Beam абстрагирует всё: один pipeline может жить на Flink, Spark, Dataflow — без правок кода.
🚀 Kafka + Flink = real-time пайплайн
FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("logs", new SimpleStringSchema(), props);
env.addSource(consumer)
.map(line -> line.toUpperCase())
.addSink(new FlinkKafkaProducer<>("processed", new SimpleStringSchema(), props));
✅ Поток заходит из Kafka, проходит трансформацию и возвращается обратно.
📊 Stateful обработка
stream.keyBy(value -> value)
.flatMap(new RichFlatMapFunction<String, Tuple2<String, Integer>>() {
private transient ValueState<Integer> count;
public void open(Configuration parameters) {
count = getRuntimeContext().getState(new ValueStateDescriptor<>("count", Integer.class));
}
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
Integer current = count.value() == null ? 0 : count.value();
count.update(current + 1);
out.collect(Tuple2.of(value, current + 1));
}
});
✅ Flink хранит состояние между событиями — perfect для realtime аналитики.
🧩 Beam с Cloud Dataflow
PipelineOptions options = PipelineOptionsFactory.create();
options.as(DataflowPipelineOptions.class).setRunner(DataflowRunner.class);
✅ Запускаешь тот же код в Google Cloud — нативно масштабируется.
💡 Spark + Kafka integration
Dataset<Row> df = spark.readStream()
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("subscribe", "topic")
.load();
✅ Spark сам читает Kafka topics и обрабатывает потоки.
🗣 Запомни: Flink — мозг real-time систем, Spark — мотор аналитики, Beam — мост между ними. Главное — не выбирай фреймворк по моде, выбирай под поток.6 680
❗️ Произошёл масштабный слив Apple, Open AI, Microsoft и других западных гигантов
В сеть утекли корпоративные документы для обучения персонала: гайды, инструкции к ИИ, инсайды по грядущим новинкам и разработкам.
Целых 4 терабайта (!) инфы распределили по закрытым каналам. Сохраняй пока доступно:
❖ Гайды по ИИ и инструментам для работы и творчества
❖ Чеклисты, фреймворки, репозитории и куча полезностей
❖ Инсайды по IT-разработкам и новым технологиям
❖ Слитая инфраструктура Apple
❖ Обучения легальному и нелегальному хаккингу
❖ Всё про Python от топов из Microsoft
❖ + бонус: канал с мемами про IT, ИИ и технологии.
👆 Подпишись, скоро поменяем ссылки
6 680
☕️Полиморфизм в ООП
В этом видео автор подробно объясняет концепцию полиморфизма в объектно-ориентированном программировании на примере Java. Разбирается, как один объект может иметь разные формы в зависимости от контекста, как работает динамическое связывание, как переопределять методы в наследниках и использовать ссылки на родительские типы для управления объектами.🗣️Запомни: полиморфизм даёт гибкость в архитектуре и делает код расширяемым и масштабируемым. 🤩 Java Фишки и трюки || #Видео
6 680
☕️Наследование в классах
В этом видео автор подробно объясняет концепцию наследования в Java: как один класс может наследовать свойства и методы другого, когда применять `extends`, как переопределять методы и использовать ключевое слово `super`.🗣️Запомни: наследование — мощный механизм для повторного использования кода и организации иерархий классов. 🤩 Java Фишки и трюки || #Видео
6 680
🤝 «Контракты не лгут: как сервисы общаются без боли»
Contract Testing в Java — контроль реальности между продами
Когда микросервисы множатся, интеграционные тесты превращаются в хаос.
Сервис А ждёт одно, сервис B отдаёт другое — и привет, баг в проде.
Contract Testing решает это через договор: что именно API обещает и возвращает.
📄 Суть контракта
Потребитель (Consumer) описывает, что он ждёт от поставщика (Provider). Provider подтверждает: «Да, я действительно так отвечаю».➡️ Это проверка не по коду, а по взаимному соглашению. ⚙️ Pact — главный игрок в Java Pact позволяет Consumer’у описывать ожидаемые запросы и ответы:
@Pact(consumer = "OrderService")
public RequestResponsePact createPact(PactDslWithProvider builder) {
return builder
.given("User exists")
.uponReceiving("a request for user details")
.path("/users/123")
.method("GET")
.willRespondWith()
.status(200)
.body("{\"id\":123,\"name\":\"Alex\"}")
.toPact();
}
➡️ Это «контракт»: JSON с ожиданиями клиента.
🧪 Consumer Test — проверка ожиданий
@ExtendWith(PactConsumerTestExt.class)
@PactTestFor(providerName = "UserService", port = "8080")
public void testUserService(MockServer server) {
Response response = get(server.getUrl() + "/users/123");
assertEquals(200, response.getStatusCode());
}
➡️ Тест проверяет, что клиент правильно формирует запрос и обрабатывает ответ.
🏭 Provider Test — подтверждение контракта
Поставщик поднимает mock и проверяет:
«Я реально возвращаю то, что обещал в контракте».
@Provider("UserService")
@PactFolder("pacts")
class UserServicePactTest {
@TestTarget
final Target target = new HttpTarget(8080);
@State("User exists")
public void userExists() {
// фикстуры для теста
}
}
➡️ Если что-то не совпадает — билд падает.
🔗 Pact Broker — центр доверия
Все контракты хранятся в брокере.
Каждый сервис знает, с кем и что согласовано.
docker run -d -p 9292:9292 pactfoundation/pact-broker
➡️ Это реестр соглашений между микросервисами.
🧩 Contract Testing ≠ интеграция
Интеграционные тесты требуют запущенные сервисы. Контрактные тесты — только спецификации.➡️ Меньше зависимостей, быстрее CI, больше стабильности. 🚀 Spring Cloud Contract — альтернатива Pact Работает прямо в Spring Boot.
contract {
request {
method 'GET'
url '/users/123'
}
response {
status 200
body(id: 123, name: "Alex")
}
}
➡️ Контракт → автогенерированный тест для Provider’а.
➕ Плюсы:
➕ Нет неожиданностей при релизах. ➕ CI ломается до продакшена, если кто-то нарушил контракт. ➕ Каждый сервис тестируется изолированно.➖Минусы:minu
➖Нужно поддерживать актуальность контрактов. ➖При множестве сервисов — много файлов. ➖Не ловит ошибки логики (только интерфейсов).🗣 Запомни: Contract Testing — это «юридическая проверка» между сервисами.
6 680
🔍Тестовое собеседование с Java-разработчиком из Мегафон уже завтра
15 октября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Мария Пивоварова, старший разработчик в Мегафон, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Мария будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Марии
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
6 680
🛰 «Смотри глубже: Observability в действии»
Мониторинг, трассировка и метрики, которые спасают прод
Observability — это не просто графики и алерты. Это способ понять, что реально происходит внутри системы.
В отличие от обычного мониторинга, observability показывает почему всё пошло не так.
Разберём, как инженеры держат прод под контролем 👇
📡 Metrics — сердце наблюдаемости
Prometheus + Grafana — золотой стандарт.
# prometheus.yml
scrape_configs:
- job_name: 'app'
static_configs:
- targets: ['app:8080']
➡️ Метрики — это числа: latency, CPU, RPS, ошибки.
Grafana визуализирует, Prometheus хранит и алертит.
🧭 Logs — что реально произошло
Elastic Stack или Loki от Grafana.
docker run -d -p 9200:9200 elasticsearch
docker run -d -p 5601:5601 kibana
➡️ Логи нужны, когда метрика показала «плохо».
Хочешь знать, почему? Иди в логи.
🚦 Traces — кто виноват в задержках
OpenTelemetry + Jaeger показывают путь запроса через микросервисы.
from opentelemetry import trace
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("db_query"):
query_database()
➡️ Trace — это маршрут.
С его помощью видно, где реально теряется время.
🧩 OpenTelemetry — единый язык наблюдаемости
Собирает метрики, логи и трассировки из любого кода.
pip install opentelemetry-sdk opentelemetry-exporter-otlp
➡️ Универсальный стандарт. Работает и с Python, и с Java, и с Go.
💡 Alerting — чтобы не узнавать о сбоях из Telegram
Prometheus + Alertmanager → уведомления при SLA-фейле.
- alert: HighErrorRate
expr: rate(http_requests_total{status="500"}[5m]) > 0.05
for: 2m
labels:
severity: critical
➡️ Хороший alert не просто орёт. Он помогает понять причину.
🧱 Distributed Context — связать всё вместе
Код → метрики → логи → трассы — одно пространство событий. Zipkin, Tempo, Jaeger — строят полную цепочку от запроса до ответа.➡️ Это основа SRE-практик: найти проблему за минуты, а не часы. 🔍 Instrumentation — чтобы код умел говорить
Библиотеки сами шлют метрики: Spring Boot Actuator, FastAPI middleware, Django signals.➡️ Observability — не внешний тул, а часть приложения. ⚙️ Cloud-native observability
AWS CloudWatch, GCP Operations Suite, Datadog, New Relic. Для Kubernetes — Lens, K9s, Grafana Tempo.➡️ Современные пайплайны включают observability как часть CI/CD. 🗣 Запомни: Observability ≠ просто мониторинг — это понимание поведения системы.
6 680
Карьерный буст, робот в подарок и призовой фонд 7 500 000 рублей 🤖
Успей зарегистрироваться до 20 октября.
Все это ждет участников трека «Программирование роботов» на всероссийском ИТ-чемпионате МТС True Tech Champ 2025. Присоединяйся, если пишешь на С++, Go, Python, JS, Java, C# или другом языке.
Соревнования пройдут в командах от 2 до 4 человек в несколько этапов:
— Квалификация. Тебе предстоит запрограммировать робота на прохождение виртуального лабиринта.
— Полуфинал. Ты будешь дистанционно управлять роботом на офлайн-полигоне и наблюдать за его перемещениями в трансляции.
— Финал. За две недели до финала организаторы отправят тебе настоящего робота для кастомизации. Ты сможешь модифицировать его, чтобы он оказался быстрее других в многоуровневом офлайн-лабиринте и смог выбить соперников с платформы в шоу-битве.
Команды финалистов получат по одному роботу Waveshare Cobra Flex в подарок и сразятся за крупные денежные призы: 4 000 000 ₽ за первое место, 2 500 000 ₽ за второе и 1 000 000 ₽ за третье.
Еще ты сможешь:
— Получить практический опыт работы с инструментами, с помощью которых создают домашних и промышленных роботов.
— Прокачать компетенции, которые помогут развиваться в ИТ.
— Заявить о себе на всю Россию и ускорить свой профессиональный рост.
📍 Финал состоится 21 ноября в МТС Live Холл в Москве.
👉🏻 Регистрируйся на сайте до 20 октября.
6 680
🔥 «Когда поток — это архитектура»
Kafka Streams и ksqlDB + Java: живые системы на событиях
Сервисы больше не должны “ждать запрос”. Современные системы реагируют на события — в реальном времени. Kafka Streams и ksqlDB превращают поток данных в ядро приложения, а не просто транспорт сообщений.
⚡️ 1. Архитектура event-driven
Kafka — это не просто очередь. Это commit-log всех событий в компании:
🟠пользователь оплатил заказ, 🟠склад обновил остатки, 🟠ML-модель прислала прогноз.➡️Java-сервис подписывается на эти события и сам становится реактивным узлом. 🧩 2. Kafka Streams — логика прямо в потоке Пример: считаем количество заказов в минуту по пользователю 👇
StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> orders = builder.stream("orders");
orders.groupByKey()
.windowedBy(TimeWindows.of(Duration.ofMinutes(1)))
.count()
.toStream()
.to("orders_per_minute");
KafkaStreams streams = new KafkaStreams(builder.build(), props);
streams.start();
➡️ Данные не хранятся — они *текут*. Поток сам агрегирует и публикует результат в новый топик.
📊 3. KTable и состояние
Kafka Streams позволяет хранить состояние между событиями:
KTable<String, Long> orderCounts = orders
.groupByKey()
.count(Materialized.as("orders-store"));
➡️ KTable — как материализованная view в БД, но в оперативной памяти и постоянно обновляется.
🧠 4. ksqlDB — SQL для стримов
Если не хочется писать Java-код, можно просто запросить поток SQL-ом:
CREATE STREAM orders_stream (user_id VARCHAR, price DOUBLE)
WITH (KAFKA_TOPIC='orders', VALUE_FORMAT='JSON');
CREATE TABLE user_revenue AS
SELECT user_id, SUM(price) AS total
FROM orders_stream
WINDOW TUMBLING (SIZE 1 HOUR)
GROUP BY user_id;
➡️ Результат — новый поток данных. Kafka сама всё поддерживает в актуальном состоянии.
🔄 5. Реактивные микросервисы
Сервисы больше не ходят в БД, чтобы “узнать новое”.
Kafka — это их канал событий.
@KafkaListener(topics = "user_revenue")
public void handleRevenue(String msg) {
System.out.println("💰 " + msg);
}
➡️ Микросервисы реагируют на новые сообщения, а не крутят cron.
🧰 6. Пример конвейера событий
[orders] → [Kafka Streams: агрегация] → [ksqlDB: фильтрация] → [billing-service]➡️ Каждый шаг — отдельная логика. Данные текут без REST-запросов. 🔗 7. Масштабирование и отказоустойчивость
Kafka Streams хранит state в RocksDB и реплицирует его между инстансами. Перезапуск — и поток сам продолжает с последнего offset.➡️ Никакой ручной синхронизации или блокировок. ⚙️ 8. Интеграция с экосистемой Spring
@EnableKafkaStreams
@Configuration
public class StreamConfig {
@Bean
public KStream<String, String> kStream(StreamsBuilder builder) {
return builder.stream("orders");
}
}
➡️ Spring Boot 3 поддерживает Kafka Streams из коробки — никаких костылей.
🚀 9. Kafka как data backbone
Kafka связывает микросервисы, ML, ETL и аналитические пайплайны. Хранилище, транспорт и очередь — всё в одном.🧩 10. Когда ksqlDB против Streams
| Сценарий | Что выбрать | | ----------------------------- | ---------------- | | Быстрый прототип, SQL-запросы | ksqlDB | | Сложная логика, типизация | Kafka Streams | | Обработка JSON и Avro | оба поддерживают | | Глубокая интеграция с Java | Streams |🗣️ Запомни:Event-driven — не мода, а способ думать в реальном времени. Kafka Streams — это код, который живёт в потоке данных.
6 680
День открытых дверей онлайн-программы «Frontend-разработчик»
Центр непрерывного образования ФКН НИУ ВШЭ открывает набор на обучение фронтенд-разработке. Слушатели познакомятся с HTML, CSS, JavaScript, TypeScript, React.js. Программа включает создание адаптивных пользовательских интерфейсов, работу с одностраничными приложениями (SPA) и реализацию итоговых проектов.
Узнать подробнее о онлайн-курсе по фронтенду вы сможете на Дне открытых дверей:
🟣как устроена веб-разработка
🟣кто такие фронтенд-разработчики и чем они занимаются
🟣что умеет делать фронтендер и почему карьера в разработке является интересной и перспективной
🟣какие знания вы приобретете на курсе и какие навыки сформируете в процессе обучения
🟣как получить максимальную пользу от занятий на курсе
Спикеры:
🎙Андрей Сухов, старший эксперт по технологиям в Сбере и преподаватель онлайн-курса «Frontend-разработчик» Центра непрерывного образования ФКН.
🎙Таисия Ахматова, менеджер по работе со слушателями и организации учебного процесса Центра непрерывного образования ФКН.
Когда: 8 октября в 18:30.
Регистрация 📍
Реклама. НИУ "ВШЭ". ИНН 7714030726. erid: 2SDnjdk7EEb
6 680
🧩 Java без JNI: как FFM API ломает старые правила
Раньше, чтобы вызвать C-код из Java, приходилось страдать с JNI — заголовки,
javah, System.loadLibrary(), краши и боль.Теперь всё проще: Foreign Function & Memory API (FFM) — новый стандарт для прямого доступа к нативным функциям и памяти.
⚙️ Импорт C-функций напрямую
FFM API позволяет вызывать функции из libc без JNI.
import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;
try (Arena arena = Arena.openConfined()) {
Linker linker = Linker.nativeLinker();
SymbolLookup libc = linker.defaultLookup();
MethodHandle printf = linker.downcallHandle(
libc.find("printf").get(),
FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.ADDRESS)
);
MemorySegment msg = arena.allocateUtf8String("Hello from C!\n");
printf.invoke(msg);
}
➡️ Всё чисто на Java: без генерации C-кода, без jni.h, с полным контролем памяти.
🧠 Работа с нативной памятью
try (Arena arena = Arena.openConfined()) {
MemorySegment segment = arena.allocate(4);
segment.set(ValueLayout.JAVA_INT, 0, 1337);
System.out.println(segment.get(ValueLayout.JAVA_INT, 0));
}
➡️ Создаёшь участок памяти, читаешь и пишешь — без Unsafe и без GC-хаоса.
🧬 Interop с существующими C-библиотеками
Хочешь вызвать strlen или qsort? Пожалуйста.
MethodHandle strlen = linker.downcallHandle(
libc.find("strlen").get(),
FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS)
);
long len = (long) strlen.invoke(arena.allocateUtf8String("PyLinux"));
System.out.println(len);
➡️ Вызываешь функции C напрямую, как будто они твои.
🧰 Безопасность и контроль
FFM API чётко ограничивает область памяти (через Arena), предотвращая утечки и use-after-free. Можно использовать “scoped memory” — живёт ровно столько, сколько нужно.🚀 Производительность
JNI требует перехода между Java и C стэками → дорого. FFM API компилируется JIT’ом и оптимизируется HotSpot → почти нативная скорость.🔬 Статический биндинг с jextract
jextract генерирует Java-обёртки по .h-файлам.
jextract -t com.libc /usr/include/stdio.h
➡️ Автоматически создаёт Java-интерфейсы для вызова C-функций — без ручного JNI.
🧱 Будущее без JNI
С FFM API Java получает настоящий доступ к низкоуровневому миру:
🟢 без C-кода, 🟢 без падений JVM, 🟢 без плясок с System.load().🗣️ Запомни:FFM API — это чистый Java-интерфейс к нативному миру. JNI уходит в прошлое. Скорость и контроль — без риска.
6 680
В России можно посещать IT-мероприятия хоть каждый день: как оффлайн, так и онлайн
Но где их находить? Как узнавать о них раньше, чем когда все начнут выкладывать фотографии оттуда?
Переходите на канал IT-Мероприятия России. В нём каждый день анонсируются мероприятия со всех городов России
📆 в канале размещаются как онлайн, так и оффлайн мероприятия;
👩💻 можно найти ивенты по любому стеку: программирование, frontend-backend разработка, кибербезопасность, дата-аналитика, osint, devops и другие;
🎙 разнообразные форматы мероприятий: митапы с коллегами по цеху, конференции и вебинары с известными опытными специалистами, форумы и олимпиады от важных представителей индустрии и многое другое
А чтобы не искать по разным форумам и чатам новости о предстоящих ивентах:
🚀 IT-мероприятия России — подписывайся и будь в курсе всех предстоящих мероприятий!
6 680
⚡️ Scoped Values в Java — альтернатива ThreadLocal для виртуальных потоков
С появлением виртуальных потоков (
Project Loom) старый ThreadLocal стал проблемой. Он держит данные на весь поток, что для миллионов lightweight-тредов дорого. Решение — ScopedValue.
📦 Объявление значения
import java.lang.ScopedValue;
public class Demo {
static final ScopedValue<String> USER = ScopedValue.newInstance();
}
➡️ Создаём "контейнер" для данных, которые будут жить только в заданной области.
🧩 Передача значения в scope
ScopedValue.where(USER, "Alice").run(() -> {
System.out.println("Hello, " + USER.get());
});
➡️ Значение доступно только внутри run(). Вышел из scope — данных нет.
⚡️ Виртуальные потоки + ScopedValue
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() ->
ScopedValue.where(USER, "Bob").run(() -> {
System.out.println("User in virtual thread: " + USER.get());
})
);
}
➡️ Локальные данные для каждого виртуального потока без утечек.
🔍 Сравнение с ThreadLocal
ThreadLocal<String> local = new ThreadLocal<>();
local.set("Alice");
➡️ Удобно, но значение живёт, пока жив поток. Виртуальные потоки → миллионы копий → утечки памяти.
🛡ScopedValue — иммутабельность
ScopedValue.where(USER, "Charlie").run(() -> {
// USER.set("Dave"); ❌ нельзя
System.out.println(USER.get());
});
➡️ Нельзя изменить внутри scope. Значение задаётся один раз, это делает код безопаснее.
🧠 Наследование scope
ScopedValue.where(USER, "Admin").run(() -> {
new Thread(() -> System.out.println(USER.get())).start();
});
➡️ Новый поток не видит значение. Данные строго локальны. Нет "магического" наследования, как у InheritableThreadLocal.
📊 Где применять
🟢 Контекст запроса (user id, trace id). 🟢 Логирование. 🟢 Передача настроек без проброса аргументов.❌ Минусы ScopedValue
🔴 Только read-only. 🔴 Живёт только в рамках scope. 🔴 Работает начиная с Java 20+.🗣 Запомни: ThreadLocal опасен для виртуальных потоков — утечки и лишняя память. ScopedValue проще: задаёшь значение в scope, читаешь только там. Без наследования, без мутабельности, идеально для миллионов lightweight-тредов.
6 680
⚡️Группа хакеров взломала сервера Skillbox, Geekbrains, Skillfactory и ещё 12 онлайн-школ, чтобы выгрузить их курсы в Telegram
Юристы пытаются удалить каналы за Авторские Права🤡 – потому вот актуальные ссылки на архивы:
По школам:
├ Skillbox (1.12 ТБ)
├ Нетология (846 ГБ)
├ SkillFactory (720 ГБ)
├ GeekBrains (934 ГБ)
└ Другие (3.21 ТБ)
По ЯП:
├ Python (1.48 ТБ)
├ SQL (982 ГБ)
├ С++ (590 ГБ)
├ C (318 ГБ)
├ GoLang (290 ГБ)
└ Другие (3.17 ТБ)
Ссылка на общий архив: @schools_hack_arc
6 680
⌨️ Что такое текстовые блоки (Text Blocks)?
Text Blocks (
""") позволяют удобно работать с многострочными строками без необходимости экранировать кавычки.
• Улучшают читаемость кода.
• Поддерживают форматирование и перенос строк.
• Упрощают работу с JSON, SQL и HTML.
✔️ Пример:
String json = """
{
"name": "Alice",
"age": 30
}
""";
System.out.println(json);
💡 Совет: Используйте Text Blocks для удобного написания больших строковых данных.
#java #textblocks #java156 680
Зарплата 207.000р у Middle-разработчика в Яндекс
«В день уходит несколько часов на созвоны, в остальное время закрываю задачки из спринта, редко перерабатываю. У компании топовый офис, но с коллективом как-то не заладилось. Радуюсь классному ДМС и стабильной зарплате» - middle разработчик из Яндекса.
Бигтех по-русски - канал с реальными зарплатами и историями IT-специалистов российского БигТеха. Там уже опубликованы рассказы программистов Альфа-банка, Сбера и Тинькофф 🤯
Читайте: @bigtech_russia
6 680
📦 Records 🆚 Sealed Classes — компактность и контроль
Record убирает шаблонный код и делает объект иммутабельным.
Sealed Class закрывает иерархию и контролирует наследование.
Разные задачи, но вместе решают боль старой Java.
🧩 Record вместо POJO
public record User(String name, int age) {}
➡️ Всё сгенерировано: геттеры, equals, hashCode, toString.
➕ Лаконичность, минимум шаблонов.
➖ Изменять поля нельзя.
📜 Класс вручную vs record
class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String name() { return name; }
public int age() { return age; }
}
➡️ Один record = десяток строк кода.
⚙️ Record с валидацией
public record Product(String name, int price) {
public Product {
if (price < 0) throw new IllegalArgumentException("price < 0");
}
}
➡️ Можно добавлять логику в compact-конструкторе.
🔒 Sealed Class: ограниченная иерархия
public sealed class Shape permits Circle, Rectangle {}
public final class Circle extends Shape {}
public final class Rectangle extends Shape {}
➡️ Никто не добавит новый Shape без изменения sealed-класса.
🎯 Record внутри sealed
public sealed interface Payment
permits CardPayment, CashPayment {}
public record CardPayment(String number) implements Payment {}
public record CashPayment(double amount) implements Payment {}
➡️ Удобное комбо: варианты — records, интерфейс — sealed.
🔎 Pattern Matching по sealed
Payment p = new CardPayment("1234");
switch (p) {
case CardPayment c -> System.out.println("💳 " + c.number());
case CashPayment c -> System.out.println("💵 " + c.amount());
}
➡️ Компилятор гарантирует, что обработаны все варианты.
📐 Sealed vs enum
sealed interface Command permits Reboot, Shutdown {}
record Reboot() implements Command {}
record Shutdown() implements Command {}
➡️ Как enum, но гибче: каждая ветка со своей структурой.
🧮 Комбинации records + sealed
sealed interface Event permits Login, Logout {}
record Login(String user) implements Event {}
record Logout(String user) implements Event {}
➡️ Модель событий простая, неизменяемая и закрытая.
🗣️Запомни:Record = компактный неизменяемый объект вместо шаблонного класса. Sealed Class = закрытая иерархия и контроль наследников.Вместе дают лаконичность и безопасность, снимая боль старой Java.6 680
🔥Приглашаем разработчиков на новый курс "Деплой микросервисов в Kubernetes. Helm"!
По ранней цене, в несколько раз ниже стоимости аналогичных программ на рынке (обычно от 40 000 до 100 000 рублей)!
Вместе с вами мы:
✅ разберём ключевые концепции деплоя микросервисов в кластер
✅ потренируемся с развёртыванием тестовых контейнеров
✅ подготовим production-ready манифесты и Helm-чарты для полноценного приложения: 6 бизнесовых микросервисов и 10 инфраструктурных компонентов (Loki, Tempo, Grafana, Keycloak, Kafka, Kafka Connect, Confluent Schema Registry, Redis, Postgres)
🔥 В результате обучения у вас будет не только понимание принципов, но и опыт в развертывании в кластере Kubernetes крупного проекта. После прохождения выдается электронный сертификат об окончании курса
Получи полноценный опыт Middle|Senior разработчика
➕ Доступен выгодный пакет с курсом Java Микросервисы, Kafka, Docker, Spring Cloud, Spring WebFlux
6 680
🛡 Java Flight Recorder + JFR Events API — профилирование прямо в коде
Обычно JFR включают флагами JVM, но начиная с Java 14 появился Events API. Теперь можно описывать и логировать свои события прямо из кода, без тяжёлых логгеров.
📦 Определение кастомного события
import jdk.jfr.Event;
import jdk.jfr.Label;
class LoginEvent extends Event {
@Label("User")
String username;
@Label("Success")
boolean success;
}
➡️ Наследуем Event и описываем поля — это как лог-сообщение, но встроенное в JVM.
🚀 Публикация события
LoginEvent e = new LoginEvent();
e.username = "ivan";
e.success = true;
e.commit();
➡️ commit() записывает событие в JFR-файл, который потом анализируется в Mission Control.
🖥 Запуск записи профиля
java -XX:StartFlightRecording=filename=recording.jfr,duration=20s -jar app.jar
➡️ Даже без кода можно собрать JFR-трассу, но с Events API появляются свои бизнес-события.
📊 Использование категорий
import jdk.jfr.Category;
@Category("Auth")
class LoginEvent extends Event {
String username;
}
➡️События группируются в категории, и в Mission Control они будут выделены как отдельный блок.
⚡️ События с таймингом
class CalcEvent extends Event {}
CalcEvent e = new CalcEvent();
e.begin();
// тяжёлая операция
e.end();
e.commit();
➡️ begin()/end() автоматически меряют длительность и пишут её в метрику.
🔗 Комбинация JFR с логами
LoginEvent e = new LoginEvent();
e.username = "alex";
e.success = false;
e.commit();
System.out.println("Login attempt failed: alex");
➡️ Лог для человека, JFR-событие для анализа и графиков — два уровня контроля.
🧩 Интеграция с потоками
class TaskEvent extends Event {
String thread;
}
TaskEvent e = new TaskEvent();
e.thread = Thread.currentThread().getName();
e.commit();
➡️Можно писать, какие потоки нагружают систему и когда они стартуют.
📑 Анализ в Mission Control
Открываешь recording.jfr — и видишь всё: GC, потоки, задержки и свои кастомные события.
🗣️ Запомни: JFR Events API — это быстрый встроенный профайлинг. Свои события почти не грузят систему, пишутся дешевле логов и помогают находить проблемы прямо в продакшене.