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

Поділитися
Вставка
  • Опубліковано 19 сер 2019
  • Cкидки до 22-го января на все курсы всего за 9.99:
    Каждый купон расчитан на 10 покупок, спешите!
    Новый курс по Photoshop:
    www.udemy.com/course/draft/33...
    HIBERNATE:
    www.udemy.com/course/hibernat...
    JPA:
    www.udemy.com/course/jpa-kurs...
    HTML + CSS:
    www.udemy.com/course/html-kur...
    MAVEN:
    www.udemy.com/course/maven-ku...
    GIT:
    www.udemy.com/course/git-stud...
    KOTLIN
    www.udemy.com/course/kotlin-b...
    SQL:
    www.udemy.com/course/sql-kurs...
    IDEA
    www.udemy.com/course/intellij...
    Паттерны Java:
    www.udemy.com/course/java-pat...
    Java EE:
    www.udemy.com/course/kurs-jav...
    Английский язык:
    www.udemy.com/course/eng-cour...
    JAVA:
    www.udemy.com/course/java-bes...
    Apache Spark:
    www.udemy.com/course/apache-s...

КОМЕНТАРІ • 52

  • @user-qj2kd8oy1r
    @user-qj2kd8oy1r 4 роки тому +3

    Скажите пожалуйста, можно ли сейчас приобрести Ваши уроки по Spring?

  • @user-ip9bn7lt6g
    @user-ip9bn7lt6g 3 роки тому

    Стоит ли использовать builder в случае если нужно проверять параметры при создании экземпляра на согласованность? Например есть класс "Регион". У него есть столица/региональный центр и просто города. По очевидным причинам, региональный центр должен лежать во множестве городов, площадь региона не должна быть меньше суммы площадей населённых пунктов и.т.д. Хотелось бы отлавливать неправильно переданные комбинации параметров, но при этом не делать этого в основном конструкторе. Если возможно, то как это можно сделать?

  • @alex57767
    @alex57767 4 роки тому +4

    Обязателен ли интерфейс? Или можно просто писать класс PersonBuilder?

    • @maxkatrenko8865
      @maxkatrenko8865 5 місяців тому

      Я тоже не понял зачем интерфейс

  • @skanderro2326
    @skanderro2326 2 роки тому +1

    Очень хорошее объяснение!

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil 2 роки тому +4

    в книгах встречал, что имена сеттеров билдера делают без слова set
    т.е. в вызов такой получается ...name("mike").age(20)...

    • @dreamer_vi905
      @dreamer_vi905 2 місяці тому

      ага в библиотеке Lombok именно так.

  • @alex_k21
    @alex_k21 4 роки тому +2

    В Вашем коде можно напрямую обращаться к полям класса Person или cделать сеттеры в классе Person. В чем смысл?

    • @husivm
      @husivm  4 роки тому +3

      Ну во первых я пишу все в одном файле для наглядности и не разбиваю на разные файлы и пакеты и не ставлю private для экономии времени, а во вторых даже если вы будете сетить каждое поле в отдельной строчке то что бы создать объект с 10 полями нужно 11 строчек кода, а используюя билдер можно создать все в одну строчку - new PersonBuilderImpl().setFirst().setSecond.setThird()....build()

  • @anikroan4357
    @anikroan4357 8 місяців тому +1

    есть вопрос) если я удалю интерфейс и оставлю вспомогательный класс со всеми его методами, изменив только то что методы возвращают( то есть уже сам вспомогательный класс а не интерфейс) все будет работать точно так же. и я все так же смогу использовать не все поля. и создать сколько угодно разный Person. зачем тогда в данном примере интерфейс?

  • @Graf_AMOR
    @Graf_AMOR 4 роки тому +4

    Хороший, важный паттерн! Знакомые конструкции из андроид-разработки

  • @user-zx5sv2hb3u
    @user-zx5sv2hb3u 4 роки тому

    Что для тебя как разработчику удобнее оказалось, win, *nix или macOS?

    • @husivm
      @husivm  4 роки тому +2

      одинаково, мак красивый, убунта глючит поэтому предпочитаю минт, а так легко работаю на любой ОС и особо разницы не замечаю

    • @husivm
      @husivm  4 роки тому +2

      А вобще у меня сейчас на работе линукс, дома винда, а видео записываю на маке потому что его можно взять в коворкинг, работаю на всем и разницы не особо замечаю

  • @romanihnatov5629
    @romanihnatov5629 3 роки тому

    А как засетать значения юзеру(в методе у билдера), если нет сетеров у него, я имею ввиду, что поля юзера будут приватными в реальной программе и дав ему сетеры, то это лишает смысла этого паттерна, как быть тогда ?

    • @husivm
      @husivm  3 роки тому +3

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

    • @romanihnatov5629
      @romanihnatov5629 3 роки тому

      @@husivm понял, спасибо, например в реализации с nested классом(либо у Вас/Джошуа Блох(Effective java), там нет сеттеров и поля вообще финальные, и насколько я понял объект получается immutable, мы один раз сбилдали и всё, либо можно не возвращать новый объект(внешнего класса), а сделать композицией и возращать новый, только если этот налл, это к примеру если нужно что-то перезасетать в объект после создания

  • @user-zx5sv2hb3u
    @user-zx5sv2hb3u 4 роки тому +1

    А если нужно обязательно указывать, например, имя?

    • @R0MaNbI4-
      @R0MaNbI4- 3 роки тому +2

      Можно сделать конструктор PersonBuilderImpl с нужными параметрами. Таким образом пользователь будет обязан ввести значение поля в конструкторе, иначе он не сможет создать Builder

  • @vladder2312
    @vladder2312 4 роки тому

    А почему не вылетает исключение при выводе неинициализированной переменной? Откуда значение по умолчанию берётся?

    • @R0MaNbI4-
      @R0MaNbI4- 3 роки тому +1

      Ты путаешь с объектами и NullPointerException
      У примитивных типов есть значение по умолчанию

  • @borymskyi
    @borymskyi Рік тому +1

    Передаю привет аннотации @Builder из ламбока.

    • @alias77799
      @alias77799 9 місяців тому +2

      Ну тут показывается как это реализуется под капотом, тоже полезно самим написать.

    • @borymskyi
      @borymskyi 9 місяців тому

      @@alias77799 да, 10 мес назад я и не дооценивал полезность ролика.

  • @Witcher-simple-YouTube
    @Witcher-simple-YouTube 2 роки тому

    Просто Мега супер огонь чотко)

  • @Das.Kleine.Krokodil
    @Das.Kleine.Krokodil 2 роки тому

    в питоне, кстати, подобные вещи решаются именованными аргументами

    • @Das.Kleine.Krokodil
      @Das.Kleine.Krokodil 2 роки тому

      я смотрю, и в котлине тоже есть такое

  • @user-xf8sy1fc7d
    @user-xf8sy1fc7d 4 роки тому +5

    А почему просто в Персоне написать сеттеры и заполнять только нужные поля?? в чем такой подход проигрывает показанному в видео? (А то про шаблон рассказали,а почему его выгоднее использовать не особо понятно)))

    • @husivm
      @husivm  4 роки тому +2

      Если использовать сеттеры что бы создать объект с 10 полями нужно 11 строчек кода, используюя билдер, можно создать все в одну строчку - new PersonBuilderImpl().setFirst().setSecond.setThird()....build()

    • @user-xf8sy1fc7d
      @user-xf8sy1fc7d 4 роки тому

      @@husivm Значит мы все сводим к компактности и читабельности кода? (Имею ввиду что это не быстрее, не эффективнее по памяти и тд)

    • @husivm
      @husivm  4 роки тому

      @@user-xf8sy1fc7d да

    • @YuriyIva
      @YuriyIva 4 роки тому

      @@husivm А как часто этот паттерн применяется на практике? Ну актуален он я так понимаю будет в POJO. Так что тогда лучше, использовать паттерн Builder + структуру POJO или всё таки конфигурацию IoC вместе с их адаптивными моделями, которые не требуют создания экземпляров по всему проекту? В плане простоты. Если мы уж берём этот патерн для простоты и читабельности.

    • @husivm
      @husivm  4 роки тому

      на практике - если у Вас много конструкторов, которые можно заменить билдером, используете билдер

  • @user-zw1ly2mq8m
    @user-zw1ly2mq8m 4 роки тому

    А хіба анотація @Builder з lombok, не робить те саме?

    • @husivm
      @husivm  4 роки тому +3

      Робить, но якби я показав просто анотицію, булоб не так зрозуміло. Дотого ж Ломбок не на всіх проектах використовуэться

  • @bogizzla
    @bogizzla 4 роки тому

    эм, уже были же уроки по паттернам, что поменялось?

  • @olegbokerov7152
    @olegbokerov7152 2 місяці тому

    Судя по другому ролику, смысл в том, что основной класс является immutable, т.е. неизменяемым - нельзя через сеттеры задавать новые значения полям - только через конструкторы, которых будет слишком много
    А на примере автора можно просто создать сеттеры и не страдать чушью, типа "теперь мы можем заполнить свойства объекта в одну строчку"

    • @user-uj2tp5sr4w
      @user-uj2tp5sr4w Місяць тому

      Тут билдер больше нужен, если у вас множество полей, но вы не все их хотите заполнять или разное их сочетание. И в целом можно обойтись конструктором, но вы явно будете прописывать null. А с помощью билдера вы собираете нужные вам поля и создаете класс. Но соглашусь, что то, как это подано у автора, можно спокойно воспользоваться сеттерами.

  • @alexfirestarter8758
    @alexfirestarter8758 4 роки тому

    а почему методы интерфейса PersonBuilder (кроме метода build) нельзя сделать void ? Почему они должны возвращать PersonBuilder ?

    • @maslus
      @maslus 3 роки тому +4

      чтобы засетать все параметры в одну строку. Если метод будет void, то мы не получим объект, к которому после точки можно дописывать следующие сеттеры по цепочке.

    • @alias77799
      @alias77799 9 місяців тому

      Method chaining

    • @maxkatrenko8865
      @maxkatrenko8865 5 місяців тому

      Чтобы объект возвращал сам себя и можно было цепочкой сетапить данные по типу obj.name('Max').surname('Brown').build(); и только build() возвращает сам объект

  • @egoszina9453
    @egoszina9453 2 роки тому

    И тебя взяли на работу в Лос-Анджелес? Втф мен!?

    • @husivm
      @husivm  2 роки тому +1

      Что не так?

  • @dosodsin3624
    @dosodsin3624 4 роки тому +4

    верните уроки по спрингу за деньги!!!

    • @YuriyIva
      @YuriyIva 4 роки тому +2

      верните уроки по спрингу - но бесплатно! С меня лайки на все 400+ видео.