Библиотека Java разработчика
前往频道在 Telegram
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
显示更多📈 Telegram 频道 Библиотека Java разработчика 的分析概览
频道 Библиотека Java разработчика (@bookjava) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 10 264 名订阅者,在 技术与应用 类别中位列第 12 013,并在 俄罗斯 地区排名第 63 881 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 10 264 名订阅者。
根据 12 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 8,过去 24 小时变化为 1,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 8.51%。内容发布后 24 小时内通常能获得 4.36% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 873 次浏览,首日通常累积 447 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 6。
- 主题关注点: 内容集中在 string, интерфейс, строка, boot, api 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.
По всем вопросам @evgenycarter
РКН clck.ru/3KoGeP”
凭借高频更新(最新数据采集于 13 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
10 264
订阅者
+124 小时
-187 天
+830 天
帖子存档
Атака на String.hashCode: прообразы и коллизии
Как-то раз мне понадобилось несколько наборов строк с коллизией по хеш-коду. То есть таких, чтобы значение String::hashCode() совпадало для всех строк в наборе.
Блуждание по интернету не дало результатов, примеров было мало и все они довольно однообразны. Поиск по словарям подарил забавную пару "javascript's".hashCode() == "monocle".hashCode(), но практической пользы не принёс. Полный перебор не рассматривался в виду скорой тепловой смерти вселенной.
Тот самый случай, когда проще сделать всё самому. Стандартная хеш-функция строки в Java считается криптографически нестойкой, так что знаний из школьного курса математики должно быть достаточно. Далее
👉@BookJava
Подборка каналов для IT специалистов 🎯
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/React_lib Подборки по React js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Метавселенная, GameFi, Crypto 📌
https://t.me/metaverse360
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Excel лайфхак📌
https://t.me/Excel_lifehack
Бесплатный онлайн-митап для Java-разработчиков от IT_One при поддержке JUG Ru Group.
IT_One Java Meetup — 18 августа, 18:00, онлайн
Доклады в программе:
✔️Роман Тищенко — «Гайд: что нужно начинающему Java-разработчику»
Из этого доклада вы узнаете об основных технологиях при разработке ПО и путях развития начинающего специалиста.
✔️Андрей Дудин, Константин Харитонов — «OPENTRACING: как перестать искать иголку в стоге сена»
Сотни микросервисов оставляют миллионы строк логов, а среди них нужно найти лишь одну. Спикеры расскажут, как OpenTracing может решить эту проблему. В конце доклада вас ждет бонус — лайфхаки, которые помогут сэкономить нервы и время при расследовании инцидентов.
Вы также сможете поучаствовать в дискуссиях и задать вопросы спикерам.
Автор лучшего вопроса получит крутую толстовку 🎁
Участие бесплатное, нужно только зарегистрироваться: https://bit.ly/3JNPHL6
Как Java выбирает перегруженный метод? (1/2)
Метод может быть перегружен различными параметрами – в классе могут существовать несколько разных методов с одинаковым названием. При вызове такого метода выбор конкретного варианта происходит на этапе компиляции (раннее связывание). В деталях алгоритм выбора перегруженного метода описан в спецификации.
Выбор происходит в два шага. На первом выбирается одна из трех фаз – множество подходящих методов.
1. Методы, в которые переданные параметры подходят по типу либо как есть, либо с применением расширения (upcasting) примитивов или ссылочных типов, исключая vararg-параметры.
2. Если в фазе 1 подходящих методов не нашлось, к ее условиям добавляются возможность боксинга/анбоксинга параметров. Обратите внимание, в комбинации работает только боксинг+расширение, но не наоборот.
3. Если и для фазы 2 нет удовлетворительных сигнатур, к условиям поиска подключаются vararg-параметры.
В случае, когда ни один метод не нашелся ни в одной фазе, компиляция завершается ошибкой.
Когда в фазе имеется несколько подходящих методов, используется наиболее специфичный среди них (но только в рамках данной фазы!).
Метод A считается более специфичным чем B, когда типы параметров одного метода – подтипы типов параметров другого. То есть любые возможные значения аргументов A подошли бы и для B, но не наоборот.
В условии специфичности говорится о типах параметров метода, а не о типах передаваемых значений. Так что боксинг/анбоксинг не учитывается, и метод с параметром
int не считается более специфичным, чем с параметром Object (в отличие от Integer). Хотя, целое число можно передавать и как Object, и как Integer. Подробное объяснение.
Когда среди методов невозможно выделить один наиболее специфичный, происходит ошибка компиляции.
#Язык
👉@BookJava☘️Хардкорный тест из 21 вопроса только для тех, кто уже знает и любит Java и хочет освоить Framework Spring.
🚀Если сможете сдать — пройдёте на продвинутый курс для разработчиков по спец.цене.
⏰ Время прохождения теста ограничено 30 минут
👉🏻ПРОЙТИ ТЕСТ: https://otus.pw/p0uI/
Thymeleaf + Spring WebFlux + Spring Security
Thymeleaf появился довольно давно, как минимум 10 лет назад, но он до сих пор весьма популярен и активно поддерживается. Шаблоны Thymeleaf удобны тем, что при простом открытии в браузере они выглядят как обычные HTML-страницы и их можно использовать как статический прототип приложения.
В этой статье рассмотрим, как создать простое приложение Spring WebFlux с Thymeleaf, аутентификацией Okta OIDC, защитой от CSRF-атак и контролем полномочий.
👉@BookJava
Сколько необходимо дополнительной памяти при вызове ArrayList.add()?
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в
1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
👉@BookJavaПочему 90% Java-разработчиков не могут вырасти из джунов долгое время ❓
Большинство специалистов еще на старте начинают совершать критические ошибки, и даже не замечают этого.
На бесплатном вебинаре 9 августа разберем основные 7 ошибок, которые встречаются на пути к карьере backend java разработчика с основателем международной IT-компании.
А также узнаем:
✔️ Почему backend-разработчики являются наиболее востребованными;
✔️ Вилки зарплат у java-разработчиков на российском и зарубежном рынках;
✔️ Как освоить профессию максимально быстро и избежать примитивных ошибок;
Участники вебинара получат бонус 🎁
Регистрация доступна по ссылке: https://clck.ru/sVjuW
Чем отличается Comparator от Comparable?
Интерфейс
Comparable определяет естественный порядок среди объектов. Java Collections Framework активно использует этот порядок. По нему упорядочены элементы SortedSet/SortedMap, им упорядочиваются элементы списков и массивов в методе sort().
Порядок определяется единственным методом compareTo. Отрицательный результат означает что текущий объект «меньше» чем переданный параметром, 0 – равен, положительный – больше. Рекомендуется чтобы равные с точки зрения equals объекты всегда были равны с точки зрения compareTo.
С математической точки зрения это должен быть линейный порядок. Он требует выполнения четырех свойств:
1. Антирефлексивность: x.compareTo(x) всегда 0;
2. Антисимметричность: если x.compareTo(y) > 0, то y.compareTo(x) < 0;
3. Транзитивность: если x.compareTo(y) > 0 и y.compareTo(z) > 0, то x.compareTo(z) > 0;
4. Полнота: отношение определено для любых объектов класса (кроме null).
Интерфейс Comparator – это логика Comparable, вынесенная в отдельный объект. Компаратор реализует паттерн Стратегия. Большинство платформенных методов, использующих Comparable имеют перегруженный вариант с не-comparable объектом и внешним компаратором.
Comparator бывает полезен, когда класс предоставлен сторонней библиотекой, и нет возможности его менять. Другой случай – особая логика упорядочивания, не свойственная классу объектов в общем, но нужная для отдельной ситуации.
Кроме основного метода compare(), в компараторе есть набор утилитарных методов для комбинирования и модификации компараторов. Все они возвращают новый компаратор, позволяя сделать его иммутабельным.
#Классы
👉@BookJavaПодборка каналов для IT специалистов 🎯
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/React_lib Подборки по React js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
CodePen 📌
https://t.me/codepen_1 Сообщество пользователей CodePen
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Чат программистов📌
https://t.me/developers_ru
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
https://t.me/arhitekturamira World Architecture
Системное администрирование 📌
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
Арбитраж трафика 📌
https://t.me/partnerochkin CPA и арбитраж трафика
Крипта 📌
https://t.me/bitkoinoff Новости криптовалют
Метавселенная, GameFi, Crypto 📌
https://t.me/metaverse360
DeepFake 📌
https://t.me/deepfakenow Публикуем deepfake видео
Мир технологий 📌
https://t.me/mir_teh Видео из мира технологий
Excel лайфхак📌
https://t.me/Excel_lifehack
🔥 Попробуйте себя в качестве автоматизатора тестирования на Java! 🔥
Cоставьте свой первый баг-репорт под руководством опытного практика 10 августа в 20:00 мск на открытом уроке в OTUS!
Что вас ждет на занятии?
📌 Разберем структуру баг-репорта,
📌 Узнаем, как правильно его оформлять,
📌 Рассмотрим наиболее частые ошибки,
📌 Вместе составим наш первый баг-репорт.
После вебинара вы сможете продолжить обучение на онлайн-курсе «Java QA Engineer. Basic».
👉🏼 Для участия зарегистируйтесь и пройдите вступительный тест https://otus.pw/GxRJ/
Чем отличается Closeable от AutoCloseable?
Интерфейс
AutoCloseable представляет объект-хранилище некоего ресурса, пока тот не закрыт. В единственном его методе close() объявляется логика закрытия этого ресурса. Пример – дескриптор открытого файла (ObjectOutputStream).
Особенность этого интерфейса в том, что его применение позволяет использовать объект в языковой конструкции try-with-resource. Всё это появилось в Java версии 7.
До Java 7 уже существовал похожий интерфейс – Closeable. Смысл его точно такой же. Он всё еще доступен в стандартной библиотеке для обратной совместимости, но в новом коде рекомендуется использовать AutoCloseable. Чтобы экземпляры старого Closeable тоже можно было использовать в try-with-resource, новый интерфейс был добавлен его родителем.
Проблема старого интерфейса Closeable была в узости типа исключений, которые может выбрасывать close(). Ковариантность позволила расширить тип в базовом интерфейсе AutoCloseable с IOException до Exception.
Еще одно отличие – контракт метода close(). Старый Closeable требует его идемпотентности, тогда как новый AutoCloseable разрешает методу иметь побочные эффекты.
#Классы #Язык
👉@BookJavaКак реализовать метод hashCode?
Если вы переопределили
equals(), то обязательно также переопределить и hashCode(). Это не просто теоретическое требование. Если класс нарушает это правило, хранение его экземпляров в качестве например ключей HashMap приводит к непредсказуемому поведению.
Результат hashCode() должен быть одинаковый для равных в смысле equals объектов. Обычно для этого значение хэш-кода вычисляется на основе значений полей, которые участвуют в equals(). Но и возвращение одной и той же константы 42 для любого экземпляра класса тоже будет валидной реализацией.
Результат hashCode() должен быть равномерно распределен. Это правило не такое строгое как остальные. Его нарушение не сломает программу, хотя может сильно ухудшить производительность. Поэтому константа 42 – допустимая, но не лучшая идея. Вместо этого все значения полей сначала приводятся к int: boolean превращается в любую пару констант, null в 0, для ссылочных типов берется их hashCode(). Затем все эти значения смешиваются с помощью бинарного оператора XOR (^). Дополнительно для лучшего распределения можно применять битовые сдвиги. Если вы владеете информацией о распределении значений полей в конкретно вашем случае, эту реализацию можно улучшить.
Результат hashCode() должен быть одинаковый на протяжении времени жизни объекта. Если вычисление хэш-кода зависит от переменных значений, сохраните его значение во внутреннее поле при первом вызове. При следующих вызовах сразу возвращайте это закэшированное значение.
#Классы
👉@BookJava💪Хотите повысить свои скиллы в Java-разработке?
🗣Присоединяйтесь к отрытому уроку 10 августа в 20:00 мск в OTUS, где мы с экспертом разберем аспекты в Java и Spring.
На занятии рассмотрим аспекты: что это и зачем нужно и узнаем, как создавать аспекты в Java, используя разные технологии, и как они используются в Spring.
☘️ Больше полезной информации по фреймворку Spring вы получите на онлайн-курсе «Разработчик на Spring Framework» OTUS.
📌Пройдите вступительный тест для проверки знаний и записи на вебинар: https://otus.pw/vWSK/
Ускоряем java-рефлексию в 2022
После прочтения заголовка у кого-то наверняка возникнет весьма логичный вопрос: «Кто такая эта ваша рефлексия и зачем её ускорять?»
И если первая часть будет волновать только совсем уж откровенных неофитов (ответ тут), то вторая точно нуждается в пояснении.
К текущему моменту рефлексия (и особенно рефлективные вызовы методов) так или иначе используется в прорве самых разных фреймворков, библиотек и просто любых приложениях, по какой-либо причине требующих динамические возможности.
Однако в java рефлексия реализована не самым быстрым (зато надёжным) способом, а именно, через использование JNI-вызовов. Далее
👉@BookJava
Инновации, цифровые технологии и собственное IT-коммьюнити — все это про Газпромбанк!
Эксперты банка регулярно выступают с классными темами. На международной Java-конференции JPoint 2022 разработчики рассказали много интересного: как писать хороший код, где искать людей для трансформации процессов и как правильно программировать контекст времени в Java.
Если ты хочешь развиваться профессионально и кодишь на Java, приглашаем стать частью команды Газпромбанка, все вакансии тут > https://vk.cc/ccWssJ
Как реализовать метод equals?
Сначала нужно решить, действительно ли вам нужно переопределять
equals(). Реализация по умолчанию делает объект равным только самому себе (сравнение на идентичность). Это имеет смысл, если у вашего класса не бывает отдельных, но логически одинаковых экземпляров.
Если два экземпляра всё-таки могут быть равны, equals() нужно переопределять. Реализация должна соблюдать контракт: это отношение эквивалентности (рефлексивность, транзитивность, симметричность), ни один объект не равен null.
Рефлексивность. первым делом проверим, не идентичен ли переданный объект текущему. Если да – сразу вернем true.
Неравенство null. Если аргумент null – сразу вернем false.
Симметричность. Если мы допускаем наследование и расширение метода equals(), в наследнике может появиться дополнительная логика, которая сделает !other.equals(this) при this.equals(other). Проще всего избежать этого, добавив сравнение типов. Если типы не равны – сразу вернем false. Почему не надо использовать instanceof.
Транзитивность. Оператор == обладает свойствами транзитивности и симметричности. Далее мы сравниваем на равенство все примитивные свойства. Для ссылочных типов этими характеристиками по контракту обладает equals – для сравнения ссылочных типов пользуемся им.
Речь здесь идет о логических свойствах. Фактически одно логическое свойство может быть представлено несколькими полями класса, или же может вычисляться на лету. Некоторые поля служат для внутренних технических нужд, и не имеют отношения к логическому состоянию. Такие поля обычно исключают из сравнения.
#Классы
👉@BookJava⁉️Хотите быстро освоить Java, но не знаете, с чего начать?
🔥Подключайтесь к отрытому уроку 8 августа в 20:00 мск. Тема занятия: «Структура программы на Java. Примитивные типы». На вебинаре познакомимся с основными этапами создания простейшей программы на Java, поймем принципы работы компилятора и виртуальной машины, а также разберемся с class-файлами. Также на уроке изучим примитивные типы данных, константы и enum.
📚Урок пройдет в рамках буткемпа «Java developer» для всех, кто хочет с нуля и за короткое время освоить профессию разработчика Junior+ уровня.
🗣Преподаватель: Непомнящий Евгений, сертифицированный Java-разработчик.
📌Регистрируйтесь на урок: https://otus.pw/PrHn/
Как инициализировать иммутабельный класс?
Если прочитать определение immutable-объекта внимательно, момент его создания – это единственный этап в жизненном цикле, когда объект может меняться. Действительно, как иначе установить это неизменяемое состояние. Отсюда, при неправильной реализации, вытекают некоторые риски дальнейшей неизменяемости.
Первое, самое очевидное правило: копируйте поля ссылочных типов. Когда пользователь передал в конструктор изменяемый объект, возможно он все еще владеет ссылкой на него. Тогда, пользуясь этой ссылкой, пользователь может менять поле вашего иммутабельного объекта позднее. Создав копию объекта-параметра перед присвоением в поле, вы получите эксклюзивную ссылку, недоступную извне.
Вторая проблема, с которой вы гораздо менее вероятно столкнетесь, но о которой нужно знать: без должной синхронизации в многопоточной среде конструктор может получить ссылку на не до конца сконструированный объект. Для поддержки создания объектов в многопоточной среде нужно обеспечить создание его полей happens-before. Проблема аналогична double-checked блокировке без ключевого слова
volatile – детали можно почитать здесь.
Что касается удобства создания immutable объектов. Если класс состоит из всего пары полей – дополнительные действия скорее всего не нужны, хватит обычного конструктора.
Однако, когда полей много, это становится проблемой. В Java, в отличие от таких языков как например TypeScript или Kotlin, нельзя указывать имена передаваемых параметров. Обычно можно воспользоваться сеттерами, но в неизменяемом классе их нет.
Похожая проблема возникает, когда процесс создания объекта не может быть атомарным, потому что он разделен между несколькими сущностями. Разные компоненты предоставляют разные поля, приходится копить их во временных переменных, прежде чем вызвать конструктор.
На помощь приходят порождающие паттерны. Самый распространенный подход – builder (паттерн Строитель). Для иммутабельного типа Foo создается дополнительный изменяемый класс FooBuilder. В билдере есть сеттеры для каждого поля. Эти сеттеры обычно возвращают this, что позволяет вызывать их в цепочке. Цепочка заканчивается методом build(), который уже создает иммутабельный Foo.
Каждый сеттер выполняет роль именованного параметра. Сам билдер, как обычный объект, можно передавать от компонента к компоненту, делегируя им части инициализации. Использование этого паттерна логически разделяет существование объекта типа Foo на два этапа – создание и использование.
#Классы
👉@BookJava
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
