TG Telegram Group Link
Channel: Java
Back to Bottom
👩‍💻 Redwood — библиотека для создания пользовательских интерфейсов на Android, iOS и в веб-приложениях с использованием Kotlin и Jetpack Compose!

🌟 Основная цель проекта — упростить разработку многоплатформенных интерфейсов, обеспечивая согласованность UI и возможность использования общих компонентов на разных платформах.

🌟 Redwood интегрирует систему дизайна и компонуемые функции (composables), что позволяет разрабатывать UI, которые адаптируются к особенностям каждой платформы. Это решение нацелено на повышение продуктивности и унификацию интерфейсов без необходимости писать отдельный код для каждой платформы.

🔐 Лицензия: Apache-2.0

🖥 Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопрос с собеседования: Статический блок и порядок инициализации

🔍 Условие:

Что выведет следующий код и почему?


public class InitializationPuzzle {
static {
System.out.println("Static block 1");
}

public static void main(String[] args) {
Child.doSomething();
}
}

class Parent {
static {
System.out.println("Parent static block");
}
}

class Child extends Parent {
static {
System.out.println("Child static block");
}

static void doSomething() {
System.out.println("Child method");
}
}


Вопрос:
Какой будет порядок вывода? Почему результат может удивить даже опытных Java-разработчиков?


🔍 Разбор:

Что происходит по шагам:

1️⃣ При запуске программы сначала загружается класс `InitializationPuzzle`. Его статический блок выполняется сразу:


Static block 1


2️⃣ Далее вызывается Child.doSomething(). Теперь происходит инициализация класса `Child`. В Java при инициализации класса-потомка сначала загружается родительский класс, если он ещё не был загружен.

- Инициализация Parent:

Parent static block


- Инициализация Child:

Child static block


3️⃣ Наконец выполняется метод doSomething():

Child method


---

Ожидаемый полный вывод:


Static block 1
Parent static block
Child static block
Child method


💥 Подвох:

• Многие разработчики думают, что раз doSomething() просто статический метод, может выполниться только он.
• Однако Java гарантирует, что перед выполнением любого статического метода класс будет полностью инициализирован.
• Также важно помнить, что при инициализации класса наследника сначала выполняются статические блоки родителя.

🛡️ Лайфхак:

Если вы хотите убедиться, что родительский класс не инициализируется при доступе к статическим полям/методам потомка, нужно использовать константы (static final), которые компилируются напрямую в байткод и не требуют загрузки класса.

Вывод:

• Java строго инициализирует классы в порядке наследования перед вызовом любых статических методов.
• Даже вызов одного «безопасного» статического метода потомка затянет за собой загрузку родителя.
• Такие задачи хорошо проверяют понимание механизма класслоадеров и инициализации классов в JVM.

💡 Бонус-вопрос:
Что изменится, если вы замените doSomething() на чтение static final поля в Child? Будет ли тогда инициализирован Parent?

@javatg
🌐 Gitnuro — кроссплатформенный Git-клиент без подписок и слежки. Этот полностью открытый клиент на Kotlin предлагает альтернативу тяжеловесным решениям вроде GitKraken или SourceTree.

В отличие от веб-ориентированных аналогов, он работает нативно на Linux, Windows и macOS, при этом не требуя активаций или подписок. Особенность проекта в поддержке сложных операций через минималистичный интерфейс.

🤖 GitHub

@javatg
🔍 VisualVM — визуальный мониторинг JVM без лишнего шума. Этот инструмент предлагает то, чего не хватает стандартным JDK-утилитам: удобного интерфейса для профилирования Java-приложений. В отличие от тяжелых решений, он встроен прямо в JDK и умеет показывать метрики кучи, потоки и CPU-нагрузку в реальном времени.

Инструмент особенно полезен для быстрой диагностики, например, когда нужно найти утечку памяти без подключения к продакшену через JMX. Сборка из исходников требует только Ant и NetBeans Platform, а плагины добавляют поддержку Sampler и Thread Dump Analyzer.

🤖 GitHub

@javatg
ХОЧЕШЬ ПОВЫШЕНИЕ В 2025 ГОДУ? 😎🔥

Тогда самое время разобраться в микросервисной архитектуре и стать более востребованным специалистом.

🚀 Стартуем 20 мая.

Курс ведет действующий архитектор Кирилл Ветчинкин. Он успешно реализовал проекты для Мегафона, Теле2, ВСS Brокer. Постоянный спикер крупных IT-конференций.
Какие скиллы прокачаем:

📌 Декомпозиция систем на микросервисы, отталкиваясь от бизнес-домена.
📌 Встройка микросервисов в оргструктуру компании.
📌Организация перехода от монолитной системы к микросервисной.

Полная программа ТУТ 👉 https://microarch.ru/courses/microservices?utm_source=posev&utm_medium=erid:2VtzqwE1oyN&utm_campaign=2

А самое главное — поддержка от спикера, чат с одногруппниками и полезные созвоны с разбором домашки.

📕 Сертификат об участии по итогам прохождения курса.
Узнай больше 👉 https://microarch.ru/courses/microservices?utm_source=posev&utm_medium=erid:2VtzqwE1oyN&utm_campaign=2

Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwE1oyN
🧠 Хитрая задача для Java-разработчиков: “Зеркальная фабрика”

📌 Условие:

Реализуйте абстрактную фабрику MirrorFactory, которая:
- При создании объекта класса T возвращает прокси, который повторяет все методы оригинального объекта
- Но дополнительно логирует имя каждого вызванного метода и автоматически вызывает метод с тем же именем у другого объекта (его зеркала)

🎯 Иными словами:


MyService original = new MyService();
MyService mirror = new MyService();

MyService proxy = MirrorFactory.create(original, mirror);
proxy.doWork();
// Лог:
// doWork() called
// original.doWork() вызван
// mirror.doWork() вызван

❗️**Ограничения:**

- Классы могут быть любыми, но должны реализовывать интерфейсы
- Использовать только стандартные средства Java (рефлексия, Proxy, `InvocationHandler`)
- Методы с одинаковым именем и сигнатурой должны быть вызваны у обоих объектов

Решение:

```java
import java.lang.reflect.*;

public class MirrorFactory {
@SuppressWarnings("unchecked")
public static <T> T create(T original, T mirror) {
Class<?> clazz = original.getClass().getInterfaces()[0];
return (T) Proxy.newProxyInstance(
clazz.getClassLoader(),
new Class[]{clazz},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "() called");
Object result1 = method.invoke(original, args);
Object result2 = method.invoke(mirror, args);
return result1; // приоритет оригиналу
}
});
}
}
```

Пример использования:

```java
interface MyService {
void doWork();
}

class MyServiceImpl implements MyService {
public void doWork() {
System.out.println("Working: " + this);
}
}
```

🔍 **Подвох:**

- Java `Proxy` работает **только с интерфейсами**
- Метод вызывается **дважды** — нужно быть осторожным с побочными эффектами
- Возврат значения только одного вызова (`original`) — важно, если метод что-то возвращает

🧠 **Чему учит задача:**

- Глубокому пониманию `java.lang.reflect.Proxy`
- Поведению `InvocationHandler` и сигнатур
- Умению комбинировать дизайн-паттерн **Proxy** и **Decorator**
- Практике метапрограммирования и логирования без изменения кода класса

---

@javatg
Эволюция архитектурного ревью в Яндекс 360

За последние четыре года команда Яндекс 360 выросла в семь раз, а количество продуктов увеличилось на шесть. Такой рост был бы невозможен без общих технологий, которые мы создаём. Вы узнаете подходы и лайфхаки, которые помогли нам выдержать рост, оставаясь в контексте создания общих решений и не переизобретая велосипеды.

Смотрите доклад Евгения Ширанкова, руководителя платформенных сервисов Яндекс 360, чтобы узнать, как развивался наш подход к проектированию сервисов и как он позволяет создавать решения, которыми пользуется весь Яндекс.

Больше материалов о технологиях в Яндекс 360
@yandex360team
🌉 Apache Beam — единый мост между batch- и stream-обработкой данных. Этот проект позволяет описывать pipelines всего один раз, а запускать их где угодно: от локальной машины до кластеров Spark или Flink, не переписывая код.

Проект использует один API для всех сценариев — будь то анализ исторических данных или обработка бесконечных потоков событий в реальном времени. При этом инструмент не навязывает конкретную инфраструктуру, оставляя свободу выбора движка исполнения.

🤖 GitHub

@javatg
Лайфхаки визуального сторителлинга 😉

Рассказываем, почему это полезно и как его построить, чтобы было понятно всем: и менеджерам, и разработчикам, и дизайнерам

И да, вы справитесь, даже если не умеете рисовать! Александр Зинченко, СТО Яндекс 360, поделился инструментами для быстрых и удобных скетчей. А ещё рассказал про сложности передачи идей в проектных командах, которые можно решить с помощью визуального сторителлинга 😎

Больше интересной и полезной информации в канале от команды Яндекс 360
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔮 IKVM — мост между Java и .NET. Инструмент превращает скомпилированные JAR-файлы в .NET-сборки, а также помогает стандартным Java-библиотекам работать как родные для C#.

Особенность проекта кроется в динамической трансляции байт-кода в CIL на лету или статической компиляции в DLL. Это открывает интересные сценарии, например, использование Java-библиотек машинного обучения в .NET-приложениях или интеграция legacy-кода без полного рефакторинга.

🤖 GitHub

@javatg
📊 Charty — библиотека для создания графиков через Compose. Проект предоставляет разработчикам простой и мощный инструмент для визуализации данных с использованием современных декларативных подходов. В отличие от других решений, Charty предлагает нативную поддержку мультиплатформенной разработки через KMP.

Библиотека поддерживает различные типы графиков — от линейных и столбчатых до круговых диаграмм, с возможностью кастомизации каждого элемента. Анимации реализованы на уровне фреймворка, что обеспечивает плавность даже при работе с динамическими данными. Особое внимание уделено производительности — рендеринг оптимизирован для работы на мобильных устройствах.

🤖 GitHub

@javatg
🌧️ Camunda 8 — облачная оркестрация бизнес-процессов. Этот open-source стек сочетает в себе движок процессов Zeebe, инструменты для мониторинга и выполнения ручных задач, образуя полноценную платформу для процессного управления.

Особенность инструмента в cloud-native архитектуре: горизонтальное масштабирование, интеграция с Kafka и Kubernetes, отсутствие жесткой привязки к реляционным СУБД. Процессы описываются визуально в BPMN 2.0, а реализовывать их можно практически на любом языке через gRPC-клиенты.

🤖 GitHub

@javatg
HTML Embed Code:
2025/06/29 05:15:49
Back to Top