Telegram Group Search
💥 Задача: Почему эта структура «ломается» в многопоточной среде?


import java.util.*;

public class BrokenImmutable {
private final Map<String, List<String>> data;

public BrokenImmutable(Map<String, List<String>> input) {
this.data = Collections.unmodifiableMap(input);
}

public Map<String, List<String>> getData() {
return data;
}

public static void main(String[] args) {
Map<String, List<String>> base = new HashMap<>();
base.put("key", new ArrayList<>(List.of("a")));

BrokenImmutable bi = new BrokenImmutable(base);
Map<String, List<String>> d = bi.getData();

d.get("key").add("🚨");

System.out.println(bi.getData());
}
}


🔍 Разбор:
С первого взгляда кажется, что BrokenImmutable — иммутабельный класс. Мы оборачиваем Map через Collections.unmodifiableMap, и поле data — final.

Но проблема в глубине структуры.

unmodifiableMap запрещает перезапись ключей, но не делает элементы внутри truly immutable. В данном случае, значение по ключу "key" — это ArrayList, которую легко модифицировать.

💣 В main() мы получили доступ к внутреннему списку и… тихо сломали инвариант класса, добавив "🚨".

Решение:
Чтобы сделать структуру действительно иммутабельной, нужно:

Копировать и оборачивать значения внутри Map.

Сделать глубокую защиту:


public BrokenImmutable(Map<String, List<String>> input) {
Map<String, List<String>> copy = new HashMap<>();
for (Map.Entry<String, List<String>> e : input.entrySet()) {
copy.put(e.getKey(), List.copyOf(e.getValue())); // immutable list
}
this.data = Map.copyOf(copy); // immutable map
}



Теперь никто не сможет мутировать data, даже если получит на него ссылку.

🧠 Вопрос на подумать:
А что если вместо ArrayList внутри Map был бы CopyOnWriteArrayList или ImmutableList от Guava? Почему CopyOnWriteArrayList — тоже плохой выбор для truly immutable структур?

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

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

🤖 GitHub

@javatg
🔥 Успех в IT = скорость + знания + окружение

Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!

AI: www.tg-me.com/ai_machinelearning_big_data
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Собеседования DS: www.tg-me.com/machinelearning_interview
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/DevOPSitsec
Data Science: www.tg-me.com/data_analysis_ml
Javascript: www.tg-me.com/javascriptv
C#: www.tg-me.com/csharp_ci
Java: www.tg-me.com/java_library
Базы данных: www.tg-me.com/sqlhub
Python собеседования: www.tg-me.com/python_job_interview
Мобильная разработка: www.tg-me.com/mobdevelop
Golang: www.tg-me.com/Golang_google
React: www.tg-me.com/react_tg
Rust: www.tg-me.com/rust_code
ИИ: www.tg-me.com/vistehno
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Frontend: www.tg-me.com/front
Big Data: www.tg-me.com/bigdatai
МАТЕМАТИКА: www.tg-me.com/data_math
Kubernets: www.tg-me.com/kubernetc
Разработка игр: https://www.tg-me.com/gamedev
Haskell: www.tg-me.com/haskell_tg
Физика: www.tg-me.com/fizmat

💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tg-me.com/addlist/mzMMG3RPZhY2M2Iy

😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy

Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
💫 Geb — Groovy-фреймворк для автоматизации браузеров. Этот фреймворк сочетает мощь WebDriver с jQuery-подобным синтаксисом выборки элементов на Groovy, делая код для скрапинга или UI-тестов неожиданно лаконичным.

Особенность инструмента в встроенной поддержке асинхронных операций. Конструкции вроде waitFor { $("p.status").text() == "Done" } избавляют от ручного ожидания AJAX-запросов. А интеграция со Spock и JUnit позволяет использовать его как для адхок-скриптов, так и для полноценных acceptance-тестов.

🤖 GitHub

@javatg
🖥 Как разработать собственного AI-ассистента на Java? Подробный разбор на практике!

Автор показывает, как с нуля создать полноценного ассистента на Java, используя современные AI-технологии. В статье — не только теория, но и конкретные примеры кода, архитектурные решения и нюансы интеграции.

Что внутри:
● Выбор архитектуры и подготовка проекта на Spring Boot
● Интеграция с языковыми моделями (LLM) через OpenAI API
● Построение цепочек prompt-инжиниринга для гибких диалогов
● Хранение истории общения, работа с сессиями
● Создание простого web-интерфейса для управления ассистентом
● Советы по деплою, безопасности и масштабированию
● Возможность добавлять новые навыки и источники знаний

Статья идеально подойдёт, если вы хотите:
— разобраться, как работает интеграция Java-приложения с LLM
— реализовать кастомные диалоги и навыки
— быстро собрать своего AI-ассистента для бизнеса или личных задач

Ссылка на подробный гайд:
🔗 https://dmitrykornilov.net/2025/05/16/building-ai-assistant-application-in-java/

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/06/15 16:26:14
Back to Top
HTML Embed Code: