Тёмный

Java паттерны проектирования 3: Builder 

Уроки Java
Подписаться 63 тыс.
Просмотров 15 тыс.
50% 1

Cкидки до 22-го января на все курсы всего за 9.99:
Каждый купон расчитан на 10 покупок, спешите!
Новый курс по Photoshop:
www.udemy.com/...
HIBERNATE:
www.udemy.com/...
JPA:
www.udemy.com/...
HTML + CSS:
www.udemy.com/...
MAVEN:
www.udemy.com/...
GIT:
www.udemy.com/...
KOTLIN
www.udemy.com/...
SQL:
www.udemy.com/...
IDEA
www.udemy.com/...
Паттерны Java:
www.udemy.com/...
Java EE:
www.udemy.com/...
Английский язык:
www.udemy.com/...
JAVA:
www.udemy.com/...
Apache Spark:
www.udemy.com/...

Опубликовано:

 

26 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 53   
@olegbokerov7152
@olegbokerov7152 5 месяцев назад
Судя по другому ролику, смысл в том, что основной класс является immutable, т.е. неизменяемым - нельзя через сеттеры задавать новые значения полям - только через конструкторы, которых будет слишком много А на примере автора можно просто создать сеттеры и не страдать чушью, типа "теперь мы можем заполнить свойства объекта в одну строчку"
@ЕвгенийБледных-у1я
@ЕвгенийБледных-у1я 5 месяцев назад
Тут билдер больше нужен, если у вас множество полей, но вы не все их хотите заполнять или разное их сочетание. И в целом можно обойтись конструктором, но вы явно будете прописывать null. А с помощью билдера вы собираете нужные вам поля и создаете класс. Но соглашусь, что то, как это подано у автора, можно спокойно воспользоваться сеттерами.
@universeunity9970
@universeunity9970 19 дней назад
Всё верно. Смысл в том, что объект иммутабельный, а у автора, кроме того, что можно воспользоваться просто сетерами, так и нарушена инкапсуляция так как поля не закрытые. Понятно, что это сделано для примера, но всё равно, так делать нельзя даже в примерах. Это базовая, фундаментальная вещь, которая должна быть всегда.
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
в книгах встречал, что имена сеттеров билдера делают без слова set т.е. в вызов такой получается ...name("mike").age(20)...
@dreamer_vi905
@dreamer_vi905 6 месяцев назад
ага в библиотеке Lombok именно так.
@skanderro2326
@skanderro2326 2 года назад
Очень хорошее объяснение!
@Graf_AMOR
@Graf_AMOR 5 лет назад
Хороший, важный паттерн! Знакомые конструкции из андроид-разработки
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
на каком языке?
@megawow2295
@megawow2295 Год назад
​@@Das.Kleine.Krokodilна русском
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil Год назад
@@megawow2295 1cник?
@borymskyi
@borymskyi Год назад
Передаю привет аннотации @Builder из ламбока.
@alias77799
@alias77799 Год назад
Ну тут показывается как это реализуется под капотом, тоже полезно самим написать.
@borymskyi
@borymskyi Год назад
@@alias77799 да, 10 мес назад я и не дооценивал полезность ролика.
@МаксимКаторгин-р5у
А почему просто в Персоне написать сеттеры и заполнять только нужные поля?? в чем такой подход проигрывает показанному в видео? (А то про шаблон рассказали,а почему его выгоднее использовать не особо понятно)))
@husivm
@husivm 5 лет назад
Если использовать сеттеры что бы создать объект с 10 полями нужно 11 строчек кода, используюя билдер, можно создать все в одну строчку - new PersonBuilderImpl().setFirst().setSecond.setThird()....build()
@МаксимКаторгин-р5у
@@husivm Значит мы все сводим к компактности и читабельности кода? (Имею ввиду что это не быстрее, не эффективнее по памяти и тд)
@husivm
@husivm 5 лет назад
@@МаксимКаторгин-р5у да
@YuriyIva
@YuriyIva 5 лет назад
@@husivm А как часто этот паттерн применяется на практике? Ну актуален он я так понимаю будет в POJO. Так что тогда лучше, использовать паттерн Builder + структуру POJO или всё таки конфигурацию IoC вместе с их адаптивными моделями, которые не требуют создания экземпляров по всему проекту? В плане простоты. Если мы уж берём этот патерн для простоты и читабельности.
@husivm
@husivm 5 лет назад
на практике - если у Вас много конструкторов, которые можно заменить билдером, используете билдер
@alex57767
@alex57767 4 года назад
Обязателен ли интерфейс? Или можно просто писать класс PersonBuilder?
@maxkatrenko8865
@maxkatrenko8865 9 месяцев назад
Я тоже не понял зачем интерфейс
@Witcher-simple-YouTube
@Witcher-simple-YouTube 2 года назад
Просто Мега супер огонь чотко)
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
в питоне, кстати, подобные вещи решаются именованными аргументами
@Das.Kleine.Krokodil
@Das.Kleine.Krokodil 2 года назад
я смотрю, и в котлине тоже есть такое
@anikroan4357
@anikroan4357 11 месяцев назад
есть вопрос) если я удалю интерфейс и оставлю вспомогательный класс со всеми его методами, изменив только то что методы возвращают( то есть уже сам вспомогательный класс а не интерфейс) все будет работать точно так же. и я все так же смогу использовать не все поля. и создать сколько угодно разный Person. зачем тогда в данном примере интерфейс?
@ВладимирКургузов-е8в
Скажите пожалуйста, можно ли сейчас приобрести Ваши уроки по Spring?
@alex_k21
@alex_k21 5 лет назад
В Вашем коде можно напрямую обращаться к полям класса Person или cделать сеттеры в классе Person. В чем смысл?
@husivm
@husivm 5 лет назад
Ну во первых я пишу все в одном файле для наглядности и не разбиваю на разные файлы и пакеты и не ставлю private для экономии времени, а во вторых даже если вы будете сетить каждое поле в отдельной строчке то что бы создать объект с 10 полями нужно 11 строчек кода, а используюя билдер можно создать все в одну строчку - new PersonBuilderImpl().setFirst().setSecond.setThird()....build()
@АзатМингалеев-в1к
@АзатМингалеев-в1к 3 года назад
Стоит ли использовать builder в случае если нужно проверять параметры при создании экземпляра на согласованность? Например есть класс "Регион". У него есть столица/региональный центр и просто города. По очевидным причинам, региональный центр должен лежать во множестве городов, площадь региона не должна быть меньше суммы площадей населённых пунктов и.т.д. Хотелось бы отлавливать неправильно переданные комбинации параметров, но при этом не делать этого в основном конструкторе. Если возможно, то как это можно сделать?
@user-zx5sv3hb2u
@user-zx5sv3hb2u 5 лет назад
А если нужно обязательно указывать, например, имя?
@R0MaNbI4-
@R0MaNbI4- 3 года назад
Можно сделать конструктор PersonBuilderImpl с нужными параметрами. Таким образом пользователь будет обязан ввести значение поля в конструкторе, иначе он не сможет создать Builder
@bogizzla
@bogizzla 5 лет назад
эм, уже были же уроки по паттернам, что поменялось?
@vladder2312
@vladder2312 5 лет назад
А почему не вылетает исключение при выводе неинициализированной переменной? Откуда значение по умолчанию берётся?
@R0MaNbI4-
@R0MaNbI4- 3 года назад
Ты путаешь с объектами и NullPointerException У примитивных типов есть значение по умолчанию
@user-zx5sv3hb2u
@user-zx5sv3hb2u 5 лет назад
Что для тебя как разработчику удобнее оказалось, win, *nix или macOS?
@husivm
@husivm 5 лет назад
одинаково, мак красивый, убунта глючит поэтому предпочитаю минт, а так легко работаю на любой ОС и особо разницы не замечаю
@husivm
@husivm 5 лет назад
А вобще у меня сейчас на работе линукс, дома винда, а видео записываю на маке потому что его можно взять в коворкинг, работаю на всем и разницы не особо замечаю
@МарянаКравець-у3д
А хіба анотація @Builder з lombok, не робить те саме?
@husivm
@husivm 5 лет назад
Робить, но якби я показав просто анотицію, булоб не так зрозуміло. Дотого ж Ломбок не на всіх проектах використовуэться
@romanihnatov5629
@romanihnatov5629 4 года назад
А как засетать значения юзеру(в методе у билдера), если нет сетеров у него, я имею ввиду, что поля юзера будут приватными в реальной программе и дав ему сетеры, то это лишает смысла этого паттерна, как быть тогда ?
@husivm
@husivm 4 года назад
Нет, сеттеры не лишают смысла, суть паттерна в том что если у тебя много поелей, и тебе надо их сетить через конструктор, при этом ты не знаешь какие поля будут сетиться, ты создашь миллион констукторов, что бы этого не делать, можно использовать паттерн билдер, при этом можно спокойно иметь сеттеры и геттеры и любой другой код который использует эти поля
@romanihnatov5629
@romanihnatov5629 4 года назад
@@husivm понял, спасибо, например в реализации с nested классом(либо у Вас/Джошуа Блох(Effective java), там нет сеттеров и поля вообще финальные, и насколько я понял объект получается immutable, мы один раз сбилдали и всё, либо можно не возвращать новый объект(внешнего класса), а сделать композицией и возращать новый, только если этот налл, это к примеру если нужно что-то перезасетать в объект после создания
@egoszina9453
@egoszina9453 3 года назад
И тебя взяли на работу в Лос-Анджелес? Втф мен!?
@husivm
@husivm 3 года назад
Что не так?
@alexfirestarter8758
@alexfirestarter8758 4 года назад
а почему методы интерфейса PersonBuilder (кроме метода build) нельзя сделать void ? Почему они должны возвращать PersonBuilder ?
@maslus
@maslus 3 года назад
чтобы засетать все параметры в одну строку. Если метод будет void, то мы не получим объект, к которому после точки можно дописывать следующие сеттеры по цепочке.
@alias77799
@alias77799 Год назад
Method chaining
@maxkatrenko8865
@maxkatrenko8865 9 месяцев назад
Чтобы объект возвращал сам себя и можно было цепочкой сетапить данные по типу obj.name('Max').surname('Brown').build(); и только build() возвращает сам объект
@dosodsin3624
@dosodsin3624 5 лет назад
верните уроки по спрингу за деньги!!!
@YuriyIva
@YuriyIva 5 лет назад
верните уроки по спрингу - но бесплатно! С меня лайки на все 400+ видео.