<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 17:19:38 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="s61_guLM3IVU4tlgS3bzwNsAsvUjgCwd_yHtKDmNQXJcfLS1ELJx5eKh_fhHeQO3GwmfXyu30r9CwXd8a4qmHA";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Модуль 5. Урок 4. Паттерн проектирования Builder. | Введение в Java</title>
<meta name="description" content="Модуль 5. Урок 4. Паттерн проектирования Builder. / Введение в Java: Получить теоретические знания о том, что такое паттерны проектирования в Java и закрепить полученные навыки на практике.">
<link rel="canonical" href="https://ru.hexlet.io/courses/java_101/lessons/builder/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Модуль 5. Урок 4. Паттерн проектирования Builder.">
<meta property="og:title" content="Введение в Java">
<meta property="og:description" content="Модуль 5. Урок 4. Паттерн проектирования Builder. / Введение в Java: Получить теоретические знания о том, что такое паттерны проектирования в Java и закрепить полученные навыки на практике.">
<meta property="og:url" content="https://ru.hexlet.io/courses/java_101/lessons/builder/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="gtjaf1Z_ra8k5pf-XTg8HWrB9CQuyiOC42Gj4J9e7MZtCRFIpAEAz5Kls2ZRN8xqqsjZjib93SBegTm0zVkLqA" />
<script src="/vite/assets/inertia-INZxX8jp.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-6pOtQ3OW.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T17:19:38.036Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"RfVFo_FI1G_yn4LYtDvdHPG319eVPHdF39Vg7zvwGNOqJI6UAzZ5D0TcpkC4NC1rMb76fZ0LiediNfq7aff_vQ","topics":[{"id":40852,"title":"Добрый день,\n\nа зачем в самом конструкторе использовать ```final``` при объявлении параметров? \nОкей мы сделали в поле класса ```private final``` переменные, а дальше зачем? \n\nПример:\n\n```\nclass Someclass {\n\nprivate final String name;\nprivate final String surname;\n\n//конструктор \npublic SomeClass(final String name, Final String surname){...} // <- вот здесь зачем final? \n\n}\n```","plain_title":"Добрый день, а зачем в самом конструкторе использовать final при объявлении параметров? Окей мы сделали в поле класса private final переменные, а дальше зачем? Пример: class Someclass { private final String name; private final String surname; //конструктор public SomeClass(final String name, Final String surname){...} // <- вот здесь зачем final? } ","creator":{"public_name":"","id":208622,"is_tutor":false},"comments":[{"creator":{"public_name":"","id":208622,"is_tutor":false},"id":89368,"body":"Большое спасибо за такой подробный ответ!","topic_id":40852},{"creator":{"public_name":"","id":208622,"is_tutor":false},"id":89237,"body":"Сергей, а можно подробнее, зачем прописывать final в сложных кейсах? Или где почитать про это.","topic_id":40852},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":89348,"body":"1. `final` желательно прописывать для переменных, которые будут использоваться во внутренних классах, объявленных внутри метода (конструктор тоже метод). Достаточно, что бы такие переменные были фактически неизменяемыми, но лучше их помечать `final`\n\nПример в коде:\n\n```java\npublic class Anything {\n\t\n\tvoid externalMethod() {\n//\t\tfinal // можно и не писать\n\t\tint number = 99;\n\t\tSystem.out.println(\"Метод внешнего класса \\n\");\n\t\tclass Inner {\n\t\t\tpublic void innerMethod() {\n\t\t\t\tSystem.out.println(\"Метод внешнего класса \\n\");\n//\t\t\t\tnumber = 15; // Error:(10, 33) java: local variables referenced from an inner class must be final or effectively final\n // спокойно используем numer\n\t\t\t\tSystem.out.println(\"number = \" + number);\n\t\t\t}\n\t\t}\n\t\tInner inner = new Inner();\n\t\tinner.innerMethod();\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tAnything instance = new Anything();\n\t\tinstance.externalMethod();\n\t}\n}\n\n```\n2. `final` стоит прописывать в тех случаях, когда можно запутаться в переменных и ошибочно изменить не ту переменную.\n\nПример в коде:\n\n```java\npublic class Anything {\n\t\n\tfinal Double difficultNumber;\n\tfinal String instanceName;\n\t\n\tpublic Anything(double a, double b, double c, String incomeString) {\n\t\tfinal // написано для наглядности по п. 1.\n\t\tint test = 10;\n\t\tthis.instanceName = incomeString;\n\t\t\n\t\tMyInterface sickSubconscious = (a1, b1, c1) -> { // вместо лямбды тут может быть анонимный класс\n\t\t\tdouble length = incomeString.length();\n//\t\t\ttest++; // Error:(15, 25) java: local variables referenced from a lambda expression must be final or effectively final\n\t\t\treturn (length * ++a1) + (length * ++b1) + (length * ++c1);\n\t\t};\n\t\t// TODO something else with numbers\n\t\ta = ++a; // модифицируем переменные до того, как \n\t\tb = ++b; // они будут применены в вычислении\n\t\tc = ++c;\n\t\tdifficultNumber = sickSubconscious.compute(a, b, c);\n\t}\n\t\n\tpublic static void main(String[] args) {\n\t\tAnything testInstance = new Anything(1, 2, 3, \"Test Instance\");\n\t\tSystem.out.println(\"TestInstance number: \" + testInstance.difficultNumber);\n\t\tSystem.out.println(\"TestInstance name: \" + testInstance.instanceName);\n\t\t\n\t}\n\t\n\t@FunctionalInterface\n\tinterface MyInterface {\n\t\tdouble compute(double a, double b, double c);\n\t}\n}\n\n```\nВ этом примере к каждой числовой ссылке можно применить модификатор `final`. Хотя код работает и без него. Но во избежание потенциальных проблем с ошибками — лучше написать `final`. Это добавит очевидности, например, для ссылки `test`. \n\nПример искусственный. Сейчас более наглядного мне ничего на глаза не попалось.\n\n\n\n\n","topic_id":40852},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":89234,"body":"В таком небольшом и простом конструкторе `final` действительно излишество. Но в сложных конструкторах, содержащие в себе некие преобразования или алгоритмы — \"маст хэв\".","topic_id":40852}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":8749,"title":"Допустим я хочу что создать объект с помощью билдера, но присвоить определенные значения только некоторым полям, или вообще что бы все поля приняли какое-то значение по умолчанию, значит мне нужно определить значения по умолчанию в самом билдере, в том месте где объявляются поля? а сам обьект создавать Contact contact = new ContactBuilder.build(); ?","plain_title":"Допустим я хочу что создать объект с помощью билдера, но присвоить определенные значения только некоторым полям, или вообще что бы все поля приняли какое-то значение по умолчанию, значит мне нужно определить значения по умолчанию в самом билдере, в том месте где объявляются поля? а сам обьект создавать Contact contact = new ContactBuilder.build(); ? ","creator":{"public_name":"Владимир Рязанов","id":142945,"is_tutor":false},"comments":[{"creator":{"public_name":"Вячеслав Ковалевский","id":5,"is_tutor":false},"id":17370,"body":"Совершенно верно, одно из использований Builder действительно для того что бы можно было задавать значения по умолчанию. ","topic_id":8749}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":11834,"title":"По сути получается, что весь бонус от Builder-а приводится к нескольким строкам в main:\n\nContactBuilder contactBuilder = new ContactBuilder().name(“Ivan”).surname(“Ivanov”)....;\nContact contact = new Contact(contactBuilder); \n\nИспользовать метод build() ContactBuilder-а ведь необязательно? Вместо его вызова можно же и прямо в main() вызвать конструктор Contact(), дав ему на вход правильно заполненный объект contactBuilder?\n","plain_title":"По сути получается, что весь бонус от Builder-а приводится к нескольким строкам в main: ContactBuilder contactBuilder = new ContactBuilder().name(“Ivan”).surname(“Ivanov”)....; Contact contact = new Contact(contactBuilder); Использовать метод build() ContactBuilder-а ведь необязательно? Вместо его вызова можно же и прямо в main() вызвать конструктор Contact(), дав ему на вход правильно заполненный объект contactBuilder? ","creator":{"public_name":"Юлия Крамаренко","id":155529,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":24592,"body":"Верно. Можно так и так.\n\nПример:\n\nMain\n```java\npackage com.test;\nimport com.test.Contact.ContactBuilder;\npublic class Main {\n\n\n public static void main(String[] args) {\n Contact c1 = new ContactBuilder()\n .name(\"c1Name\")\n .surname(\"c1Surname\")\n .mail(\"c1Mail\")\n .adres(\"c1Adres\")\n .build();\n\n\n Contact c2 = new Contact(new ContactBuilder()\n .name(\"c2Name\")\n .surname(\"c2Surname\")\n .mail(\"c2Mail\")\n .adres(\"c2Adres\"));\n\n System.out.println(c1);\n System.out.println(c2);\n\n }\n}\n```\nContact\n```java\npackage com.test;\n\npublic class Contact {\n private final String name;\n private final String surname;\n private final String mail;\n private final String adres;\n\n Contact(final ContactBuilder cb) {\n this.name = cb.getName();\n this.surname = cb.getSurname();\n this.mail = cb.getMail();\n this.adres = cb.getAdres();\n }\n\n @Override\n public String toString() {\n\n return new StringBuilder().append(name + \", \").append(surname + \", \").append(mail + \", \").append(adres).toString();\n }\n\n static class ContactBuilder {\n private String name;\n private String surname;\n private String mail;\n private String adres;\n\n\n public ContactBuilder name(final String name) {\n this.name = name;\n return this;\n }\n\n public ContactBuilder surname(final String surname) {\n this.surname = surname;\n return this;\n }\n\n public ContactBuilder mail(final String mail) {\n this.mail = mail;\n return this;\n }\n\n public ContactBuilder adres(final String adres) {\n this.adres = adres;\n return this;\n }\n\n public String getName(){\n return name;\n }\n\n public String getSurname(){\n return surname;\n }\n\n public String getMail(){\n return mail;\n }\n\n public String getAdres(){\n return adres;\n }\n\n public Contact build(){\n return new Contact(this);\n }\n }\n}\n```","topic_id":11834},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":24676,"body":"Потому что у нас нет конструктора `ContactBuilder-а`.\n\n`final` поля необходимо инициализировать (дать значение, адрес в оперативе) в момент создания объекта.\n\nА мы сначала создаем объект `ContactBuilder-а`, а потом заполняем его, по мере необходимости.\n\nА вот сам объект `Contact`, в данном случае, должен быть не изменяем после создания. Что бы передавая его в другие части кода, он не менялся. И как можно заметить в коде - `final` поля `Contact-a` заполняются как раз в момент создания - конструктором \"при поддержке\" билдера ))","topic_id":11834},{"creator":{"public_name":"Юлия Крамаренко","id":155529,"is_tutor":false},"id":24683,"body":"Ясно, спасибо","topic_id":11834},{"creator":{"public_name":"Юлия Крамаренко","id":155529,"is_tutor":false},"id":24610,"body":"Ну да, весь этот код, по сути, реализует 2 шага:\n1. создаем и правильно заполняем ContactBuilder \n2. используем уже корректно заполненный объект ContactBuilder, передав его в конструктор Contact-а\n\nА почему в ContactBuilder-е приватные поля не final?","topic_id":11834},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":86028,"body":"> но ведь Contact не должен быть public?\n\nЕсли в контексте поля — это решает тот, кто его использует. Все зависит от задачи.\n\nЕсли мы говорим об объявлении класса — то скорее всего он должен быть `public` т.к. этот класс будут использовать и за пределами его пакета.","topic_id":11834},{"creator":{"public_name":"Андрей","id":261220,"is_tutor":false},"id":86037,"body":"А почему вы в примере выше создали геттеры для билдера, но не создали для основного класса? Вроде бы можно напрямую передать поля билдера конструктору Contact, а уже поля Contacta передавать через геттеры?","topic_id":11834},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":87665,"body":"> но ведь класс ContactBuilder(CB) находится внутри Contact, или это означает что CB может использовать ВСЕ методы и поля Contact в том числе и private, а Contact все кроме private?\n\n`ContactBuilder` может, а сам `Contact` не может. И как конструктору контакта напрямую, в данном случае, получить доступ к `private` полям `ContactBuilder`?\n\nИли переформулируйте свой вопрос с примером. Вдруг я неверно его понял.","topic_id":11834},{"creator":{"public_name":"Андрей","id":261220,"is_tutor":false},"id":86020,"body":"**Сергей Алексеенко**, но ведь Contact не должен быть public ?","topic_id":11834},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":86042,"body":"> А почему вы в примере выше создали геттеры для билдера, но не создали для основного класса?\n\nДля экономии места. А возможно этот класс может только в виде строки все свои параметры отдавать, а не по отдельности каждый. Вот такая задумка.\n\n> Вроде бы можно напрямую передать поля билдера конструктору Contact...\n\nКак, они же `private`?! И делать их более открытыми нельзя, т.к. к ним получат доступ и другие классы не только на чтение но и на изменение.. Особенно весело, если это будет происходить в разных потоках над одним объектом.\n","topic_id":11834},{"creator":{"public_name":"Андрей","id":261220,"is_tutor":false},"id":86059,"body":"**Сергей Алексеенко**, \n> Как, они же private?! И делать их более открытыми нельзя, т.к. к ним получат доступ и другие классы не только на чтение но и на изменение.. Особенно весело, если это будет происходить в разных потоках над одним объектом.\n\nно ведь класс ContactBuilder(CB) находится внутри Contact, или это означает что CB может использовать ВСЕ методы и поля Contact в том числе и private, а Contact все кроме private?","topic_id":11834}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":20875,"title":"Здравствуйте,не могу понять что происходит при:\n```\npublic GameBuilder player1(final Player player1) {\n this.player1 = player1;\n return this;\n }\n```\n\n\nКонкретно:\n 1) Для чего происходит возврат `Gamebuilder` - это позволяет в дальнейшем использовать его метод `Player1`, для записи в него данных?\n 2) Что нам даёт использование в качестве типа Класс? \n3) Как можно в дальнейшем использовать экземпляр класса, который вернули через `return this`?","plain_title":"Здравствуйте,не могу понять что происходит при: public GameBuilder player1(final Player player1) { this.player1 = player1; return this; } Конкретно: 1) Для чего происходит возврат Gamebuilder - это позволяет в дальнейшем использовать его метод Player1, для записи в него данных? 2) Что нам даёт использование в качестве типа Класс? 3) Как можно в дальнейшем использовать экземпляр класса, который вернули через return this? ","creator":{"public_name":"","id":182667,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":44232,"body":"Здравствуйте.\n\nДля начала стоит понять, что экземпляр класса(объект) и ссылка на него это не одно и то же.\nПример:\n```java\n{ 1 } { 2 }{!}{ 3 }\nSomeObjekt someObjekt = new SomeObjekt();\n```\n{1} Тип ссылки (переменной)\n\n{2} Имя ссылки на объект (именованная ссылка)\n\n{3} Создание самого объекта где-то в оперативной памяти...\n\n{!} Записываем в ссылку `someObjekt` адрес объекта, который где-то в памяти.\n\n_____\n> Для чего происходит возврат Gamebuilder - это позволяет в дальнейшем использовать его метод Player1, для записи в него данных?\n\nВ данном случае метод `player1()`(с маленькой буквы!) присваивает соответствующему полю значение и возвращает объект к которому он принадлежит. Это позволяет использовать любые другие доступные методы объекта.\n\n________\n> Что нам даёт использование в качестве типа Класс?\n\nТо же, что и Object, String и т.д. В JAVA всё есть объекты, которые можно поделить на примитивные и не примитивные. А каждый объект создается из класса. \n\nВозьмем пример с другим типом:\n```java\npublic Sring fooMethod() { //указываем, что метод вернет объект типа \"String\"\n retotn \"some string\"; //Собственно возвращаем его\n} //\"String\" ведь тоже просто класс из стандартной библиотеки!\n```\n\nТак что в строке `public GameBuilder player1(final Player player1) {` мы просто указываем какого типа будет наш возвращаемый объект.\n\n_____\n> Как можно в дальнейшем использовать экземпляр класса, который вернули через return this?\n\nТак же как если бы этот экземпляр имел свою именованную ссылку)\n\nУ возвращенного экземпляра класса (объекта) мы можем вызывать все доступные нам методы. Без `return this` пришлось бы объявлять ссылку(поле) типа `GameBuilder` с условным именем `gameBilder` и постепенно заполнять его поля через имя ссылки на объект.\n\nПример:\n```java\nGameBuilder gameBilder = new GameBuilder();\ngameBilder.player1(pl1);\ngameBilder.player2(pl2);\ngameBilder.field(field);\n... и т.д.\n```\nПосле чего наполненный `gameBilder` нужно было бы передать в конструктор класса `Game`.\n\nНо билдер(его объект) это все делает сам, предоставляя доступ к себе через `this` без отдельного объявления именованной ссылки.","topic_id":20875},{"creator":{"public_name":"","id":182667,"is_tutor":false},"id":44272,"body":"спасибо,стало немного понятнее)","topic_id":20875},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":44312,"body":"Если есть дополнительные вопросы - не стесняйтесь, с удовольствием отвечу )","topic_id":20875}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":5691,"title":"Не понял, при чем тут мутабельность в вопросе из теста:\n\n```\nВ каких случаях не стоит использовать паттерн builder?\n\nЕсли класс mutable и его поля можно изменять\n```\nВ ссылках под видео вообще ничего не говорится про мутабельность, да что там говорить - там ни одного `final` нет. \nВпрочем, я вообще не понял, зачем билдер нужен, видимо не дорос еще. Нет, преимущество реализации из видео я понял (хотя оно выглядит натянуто на фоне возможностей IDE). Но вот в общем и целом... \n\nЕсть такая цитата о преимуществах:\n1. _... Требуется поэтапное построение объектов с контролем результатов выполнения каждого этапа._\n2. _Данные должны иметь несколько представлений. ..._\n\nТо же самое из описания под видеоуроком: _... появляется контроль над процессом создания объектов, позволяет изменять внутреннее представление объекта ..._\n\nПреимущество из видеоурока я бы отнес к первому пункту - контроль построения. Но насчет множественных представлений (хотя, судя по слухам, для этого больше Factory подходит, чем Builder) - не проще ли для их создания без всяких паттернов просто наследоваться от базового класса?\n","plain_title":"Не понял, при чем тут мутабельность в вопросе из теста: В каких случаях не стоит использовать паттерн builder? Если класс mutable и его поля можно изменять В ссылках под видео вообще ничего не говорится про мутабельность, да что там говорить - там ни одного final нет. Впрочем, я вообще не понял, зачем билдер нужен, видимо не дорос еще. Нет, преимущество реализации из видео я понял (хотя оно выглядит натянуто на фоне возможностей IDE). Но вот в общем и целом... Есть такая цитата о преимуществах: 1. ... Требуется поэтапное построение объектов с контролем результатов выполнения каждого этапа. 2. Данные должны иметь несколько представлений. ... То же самое из описания под видеоуроком: ... появляется контроль над процессом создания объектов, позволяет изменять внутреннее представление объекта ... Преимущество из видеоурока я бы отнес к первому пункту - контроль построения. Но насчет множественных представлений (хотя, судя по слухам, для этого больше Factory подходит, чем Builder) - не проще ли для их создания без всяких паттернов просто наследоваться от базового класса? ","creator":{"public_name":"Andy","id":117329,"is_tutor":false},"comments":[{"creator":{"public_name":"Вячеслав Ковалевский","id":5,"is_tutor":false},"id":10222,"body":"Это был достаточно распространенный вопрос посему мы даже записали дополнительное видео где попытался подробно рассказать почему mutable это плохо а так же почему Builder помогает достаточно просто создавать immutable объекты: https://youtu.be/LKZitan48Rc?list=PLsQAG1V_t58BZtW5I9BCfqWBD6iAbPkEr \n\nЧасто Builder и правда используется для упрощения создания immutalbe объектов. \n\nВ целом Builder помогает уменьшить число ошибко при создании объектов у которых конструктор на вход принимает большое колличество однотипных объектов. Позволяет проверить данные и те данные которые не были установленны оставить в default виде. Конустроктор же на вход всегда будет требовать все параметры. Ну или нужно много конкструкторов что становиться анти-паттерном если полей больше 2-3х.","topic_id":5691}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":10775,"title":"Доброго времени суток! \n\nУ меня есть вопрос касательно вот такого присвоения ссылки на объект final Player p = new PlayerBuilder(). Подскажите, пожалуйста, в какой лекции про это рассказывалось подробно. Мне казалось, что ссылка начинает ссылаться на объект типа PlayerBuilder, а не Player и соответственно к его методам она уже не имеет доступа. Буду признателен за пару статей, чтобы прочитать об этом подробнее. ","plain_title":"Доброго времени суток! У меня есть вопрос касательно вот такого присвоения ссылки на объект final Player p = new PlayerBuilder(). Подскажите, пожалуйста, в какой лекции про это рассказывалось подробно. Мне казалось, что ссылка начинает ссылаться на объект типа PlayerBuilder, а не Player и соответственно к его методам она уже не имеет доступа. Буду признателен за пару статей, чтобы прочитать об этом подробнее. ","creator":{"public_name":"Артем Кузнецов","id":150080,"is_tutor":false},"comments":[{"creator":{"public_name":"Вячеслав Ковалевский","id":5,"is_tutor":false},"id":22428,"body":"Что бы подсказать с материалом нужно лучше понять вопрос. \n\n```final Player p = new PlayerBuilder();```\n\nТакая запись работать не будет так как тип ссылки и тип объекта разные. А вот что=то типа \n\n```final Player p = new PlayerBuilder().build();```\n\nбудет работать корректно так как метод ```build``` возвращает объект типа ```Player```.","topic_id":10775},{"creator":{"public_name":"Артем Кузнецов","id":150080,"is_tutor":false},"id":22430,"body":"Точно, как-то пропустил это мимо себя во время просмотра видео-лекции. Спасибо Вячеслав за помощь! ","topic_id":10775}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":2554,"title":"Доброго дня! Посоветуйте, пожалуйста, хорошую книгу по JAVA. Чтобы всегда иметь под руками хороший справочник. Заранее, благодарен.","plain_title":"Доброго дня! Посоветуйте, пожалуйста, хорошую книгу по JAVA. Чтобы всегда иметь под руками хороший справочник. Заранее, благодарен. ","creator":{"public_name":"Василий","id":84854,"is_tutor":false},"comments":[{"creator":{"public_name":"Глеб Бочкарёв","id":50147,"is_tutor":false},"id":4182,"body":"Посмотрите обсуждение в [группе](http://vk.com/java8?w=wall-85021419_196)","topic_id":2554}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":6154,"title":"Здравствуйте. Прошел практическое задание, решил свериться с \"Ответом учителя\". И не увидел в классах Game и Player геттеров. Куда они убежали? И почему? Я понимаю что у билдера есть эти методы, но это ж \"совсем не то\". Неужели теперь нельзя обратиться к Player напрямую и узнать его имя? Неужели в этом есть vulnerability? Вообщес вопрос \"ПОЧЕМУ?\". Спасибо","plain_title":"Здравствуйте. Прошел практическое задание, решил свериться с \"Ответом учителя\". И не увидел в классах Game и Player геттеров. Куда они убежали? И почему? Я понимаю что у билдера есть эти методы, но это ж \"совсем не то\". Неужели теперь нельзя обратиться к Player напрямую и узнать его имя? Неужели в этом есть vulnerability? Вообщес вопрос \"ПОЧЕМУ?\". Спасибо ","creator":{"public_name":"Andrushka","id":5361,"is_tutor":false},"comments":[{"creator":{"public_name":"Вячеслав Ковалевский","id":5,"is_tutor":false},"id":11204,"body":"Скорее всего какая то бага ибо геттеры там есть, и собственно они не в решении учителя, они там просто в классе за рамками того места где нужно код писать. Так что Вы правы - они та мдолжны быть (и есть =) ).","topic_id":6154},{"creator":{"public_name":"Andrushka","id":5361,"is_tutor":false},"id":11220,"body":"Теперь понял как работает \"Решение Учителя\". Отображается только соответствующий кусок кода, а не весь класс. Спасибо.","topic_id":6154}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":42912,"title":"Добрый вечер, подскажите, пожалуйста в чем проблема https://ru.hexlet.io/code_reviews/267665 ?\nЭто как раз-таки связано с примечанием в задании: \"проверить, а не отвалилось ли что-то еще в процессе изменений.\" ?","plain_title":"Добрый вечер, подскажите, пожалуйста в чем проблема https://ru.hexlet.io/code_reviews/267665 ? Это как раз-таки связано с примечанием в задании: \"проверить, а не отвалилось ли что-то еще в процессе изменений.\" ? ","creator":{"public_name":"Yauhen Artsiomenka","id":271370,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":93334,"body":"Здравствуйте.\n\n> Это как раз-таки связано с примечанием в задании: \"проверить, а не отвалилось ли что-то еще в процессе изменений.\" ?\n\nНет. обратите внимание на вывод компилятора, там много однотипных ошибок: `error: class, interface, or enum expected`.\n\nА теперь внимательно посмотрите в файлы, на которые указывает компилятор, и скажите, что там не так?\n\nБудьте внимательны. Вероятно стоит повторить начальные темы, где рассказано из чего состоит класс в java и как он должен быть обязательно оформлен в файле с кодом.\n\n","topic_id":42912}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}},{"id":39479,"title":"https://ru.hexlet.io/code_reviews/229883 не понимаю почему выдает ошибку","plain_title":"https://ru.hexlet.io/code_reviews/229883 не понимаю почему выдает ошибку ","creator":{"public_name":"Валерия Васильева","id":248245,"is_tutor":false},"comments":[{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":86478,"body":"В классе `Main` было обращение к несуществующему методу.\n\nВнимательно посмотрите в класс `Player`, чего там не хватает?","topic_id":39479},{"creator":{"public_name":"Сергей Алексеенко","id":102837,"is_tutor":false},"id":86553,"body":"> Так,тогда такой вопрос,зачем в классе Game геттеры\n\nЧтобы иметь доступ (чтение) приватных полей. Это из предыдущих уроков. Поэтому в текущей лекции на этом не заострялось внимание.\n\n> ,и в задании не требовалось\n\nПотому что они там уже были написаны.\n\nНо Вы же понимаете, что приватным полям нужны геттеры? Зачем Вы удалили эти геттеры из кода?\n\n> отдельный вопрос почему плееры достаются с помощью this в этих геттерах.\n\nЭто демонстрация того, что java, по сути сама добавляет `this` в обращениях к полям и методам текущего объекта внутри самого объекта.\n\nСбросьте прогресс в этом задании и напишите свое решение заново.","topic_id":39479},{"creator":{"public_name":"Валерия Васильева","id":248245,"is_tutor":false},"id":86534,"body":"https://ru.hexlet.io/code_reviews/229883\nТак,тогда такой вопрос,зачем в классе Game геттеры,вот в лекции такого нет,и в задании не требовалось,отдельный вопрос почему плееры достаются с помощью this в этих геттерах.Судя по всему не хватает геттеров в классе Player,но опять же в задании это не ребовалось и я не понимаю почему их наличие там на данном этапе важно.\n","topic_id":39479}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","entity_url":null,"active":true}}],"lesson":{"exercise":null,"units":[{"id":333,"name":"theory","url":"/courses/java_101/lessons/builder/theory_unit"},{"id":335,"name":"quiz","url":"/courses/java_101/lessons/builder/quiz_unit"}],"links":[],"ordered_units":[{"id":333,"name":"theory","url":"/courses/java_101/lessons/builder/theory_unit"},{"id":335,"name":"quiz","url":"/courses/java_101/lessons/builder/quiz_unit"}],"id":236,"slug":"builder","state":"approved","name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","course_order":22,"goal":"Получить теоретические знания о том, что такое паттерны проектирования в Java и закрепить полученные навыки на практике.","self_study":null,"theory_video_provider":"vimeo","theory_video_uid":"143599716","theory":"_Паттерн создания объектов Builder_, используется для отделения процесса создания некоторого сложного объекта от его представителя. Таким образом можно получать разные представления объекта, используя один и тот же шаблонный процесс. Сам Builder требует создания дополнительного класса, с точно таким же названием и добавлением к нему слова Builder. \n\n// Немного про внутренние классы, для понимания этого паттерна. \n\nJava язык очень многословный, но такой вариант решения задач уменьшает число ошибок в коде (такой код называют чистым).\n\n_Плюсы паттерна Builder_ - появляется контроль над процессом создания объектов, позволяет изменять внутреннее представление объекта, отделяет процесс создания объекта от его внутреннего представления.\nМинусом является то, что сам Builder и созданный объект жестко связаны между собой - если понадобится изменить что-то в Builder, придется вносить изменения и в созданном объекте. \n\n## Ссылки для прочтения\n\n* [Строитель (шаблон проектирования) wiki](https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F));\n* [Паттерн Builder на Java - Строитель](http://www.javenue.info/post/58);\n* [Паттерн Строитель (Builder)](http://jdevnotes.blogspot.com/2010/10/builder.html);\n\n\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":4,"name":"theory","url":"/courses/java_101/lessons/intro_to_java/theory_unit"}],"links":[],"ordered_units":[{"id":4,"name":"theory","url":"/courses/java_101/lessons/intro_to_java/theory_unit"}],"id":3,"slug":"intro_to_java","state":"approved","name":"Модуль 1. Урок 1. Введение в Java.","course_order":1,"goal":"Рассмотреть темы уроков сета Java 101: изучение Java с нуля, переход на Java SE8 и практическая разработка своего ПО.","self_study":null,"theory_video_provider":"youtube","theory_video_uid":"T13TlpHyxPU","theory":"## Цели курса\n\n* научиться основам программирования на Java\n* получить достаточно знаний, чтобы пройти сертификации первого уровня + основы функционального программирования из Java 8\n* получить практические навыки использования языка - написать реальный проект в процессе обучения\n\n## Условия для старта\n\n* добросовестно подходить к изучению\n* минимальное знание английского\n* необязательный опыт программирования\n* огромное желание учиться\n* внимательность!\n\nВ случае ядерной войны доступны контакты преподавателя курса (_в приоритете подписчики_):\n\n* skype: b0noii\n* e-mail: viacheslav@b0noi.com\n* twitter: [@b0noi](https://twitter.com/b0noi)\n\n## Структура курса\n\n* 10 больших модулей программы от oracle\n* на каждый модуль по 4+ урока\n* после курса будет большой тест.\n* почти каждый урок будет состоять из:\n\t- видео и текстового материала,\n\t- теста на основе теории и дополнительных материалов,\n\n## Дополнительные материалы\n\n- С первых дней обучения, уделяйте внимание [java code-style](https://www.lar.ru/java-codestyle/).\n- С тех же первых дней, у вас будет много вопросов и ошибок. Не стесняйтесь задавать вопросы! Но задавайте вопросы как можно точнее, чтобы получить точный ответ. Вот хорошая статья о том [как задавать вопросы](https://ru.hexlet.io/blog/posts/question-rules). Этот подход пригодится вам не только в обучении но и в работе!\n"},"id":31,"slug":"java_101","challenges_count":0,"name":"Введение в Java","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"free","description":"Практический курс по Java «с нуля» от инженера с опытом работы в крупнейших ИТ-компаниях мира.\n\nКурс посвящен изучению основ Java, популярного объектно-ориентированного языка программирования, разработанного компанией Oracle. Программы на Java транслируются в байт-код, который выполняет виртуальная машина Java (JVM). JVM — это программа, обрабатывающая байтовый код и передающая инструкции оборудованию как интерпретатор. Это позволяет выполнять Java-приложения на любом устройстве, для которого существует соответствующая виртуальная машина, независимо от операционной системы и оборудования.\n\nКурс рассчитан как на людей, не сталкивавшихся с программированием, так и на начинающих программистов.\nРекомендуемое продолжение — курс [Java Generics](https://ru.hexlet.io/courses/java_generics).","kind":"sandbox","updated_at":"2026-01-20T11:54:32.501Z","language":"java","duration_cache":45120,"skills":["Создавать несложные программы, используя основные конструкции языка (условия, циклы, методы и другие)","Разделять код на методы для повторного использования","Правильно анализировать ошибки в коде и пользоваться отладочной печатью при их поиске"],"keywords":["основы Java","JVM","логика","типы данных","алгоритмы"],"lessons_count":38,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6ODk5NCwicHVyIjoiYmxvYl9pZCJ9fQ==--50ee157ee29e5c50f50aa2191806e9d83fca25e6/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--6067466c2912ca31a17eddee04b8cf2a38c6ad17/image.png"},"recommendedLandings":[],"lessonMemberUnit":null,"accessToLearnUnitExists":true,"accessToCourseExists":true},"url":"/courses/java_101/lessons/builder/theory_unit","version":"0b0c6d4ebbd40fd58630a0dd89cc25544ccdf24e","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Введение в Java</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Модуль 5. Урок 4. Паттерн проектирования Builder.</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Модуль 5. Урок 4. Паттерн проектирования Builder.","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"Введение в Java"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div style="margin-bottom:var(--mantine-spacing-xl)" class=""><div class="ratio ratio-16x9"><iframe width="100%" height="auto" src="//player.vimeo.com/video/143599716" loading="lazy" allowFullScreen="" title="video"></iframe></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><p><em>Паттерн создания объектов Builder</em>, используется для отделения процесса создания некоторого сложного объекта от его представителя. Таким образом можно получать разные представления объекта, используя один и тот же шаблонный процесс. Сам Builder требует создания дополнительного класса, с точно таким же названием и добавлением к нему слова Builder.</p>
<p>// Немного про внутренние классы, для понимания этого паттерна.</p>
<p>Java язык очень многословный, но такой вариант решения задач уменьшает число ошибок в коде (такой код называют чистым).</p>
<p><em>Плюсы паттерна Builder</em> - появляется контроль над процессом создания объектов, позволяет изменять внутреннее представление объекта, отделяет процесс создания объекта от его внутреннего представления.
Минусом является то, что сам Builder и созданный объект жестко связаны между собой - если понадобится изменить что-то в Builder, придется вносить изменения и в созданном объекте.</p>
<h2 id="heading-2-1">Ссылки для прочтения</h2>
<ul>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)" rel="noopener noreferrer" target="_blank">Строитель (шаблон проектирования) wiki</a>;</li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://www.javenue.info/post/58" rel="noopener noreferrer" target="_blank">Паттерн Builder на Java - Строитель</a>;</li>
<li><a style="text-decoration:underline" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="http://jdevnotes.blogspot.com/2010/10/builder.html" rel="noopener noreferrer" target="_blank">Паттерн Строитель (Builder)</a>;</li>
</ul></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/java_101/lessons/builder/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 38</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/java_101/lessons/builder/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-CdBlNCiQ.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-nkZBEvfU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>