<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你還在 new 對(duì)象嗎?Java8 通用 Builder 了解一下?

          共 12018字,需瀏覽 25分鐘

           ·

          2021-10-12 21:27

          ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????

          來(lái)自丨$t_^Cipher's Blog___n

          https://www.ciphermagic.cn/java8-builder.html


          程序員經(jīng)常會(huì)遇到靈魂拷問(wèn):你有對(duì)象嗎?

          沒(méi)有,但我可以 new 一個(gè)!

          public class GirlFriend {
              private String name;
              private int age;
              // 省略 getter & setter ...
              public static void main(String[] args) {
                  GirlFriend myGirlFriend = new GirlFriend();
                  myGirlFriend.setName("小美");
                  myGirlFriend.setAge(18);
              }
          }

          沒(méi)問(wèn)題,老鐵!但如果對(duì)象的屬性太多,咋辦?

          public class GirlFriend {
              private String name;
              private int age;
              private int bust;
              private int waist;
              private int hips;
              private List<String> hobby;
              private String birthday;
              private String address;
              private String mobile;
              private String email;
              private String hairColor;
              private Map<String, String> gift;
              // 等等等等 ...
              // 省略 getter & setter ...
              public static void main(String[] args) {
                  GirlFriend myGirlFriend = new GirlFriend();
                  myGirlFriend.setName("小美");
                  myGirlFriend.setAge(18);
                  myGirlFriend.setBust(33);
                  myGirlFriend.setWaist(23);
                  myGirlFriend.setHips(33);
                  myGirlFriend.setBirthday("2001-10-26");
                  myGirlFriend.setAddress("上海浦東");
                  myGirlFriend.setMobile("18688888888");
                  myGirlFriend.setEmail("[email protected]");
                  myGirlFriend.setHairColor("淺棕色帶點(diǎn)微卷");
                  List<String> hobby = new ArrayList<>();
                  hobby.add("逛街");
                  hobby.add("購(gòu)物");
                  hobby.add("買(mǎi)東西");
                  myGirlFriend.setHobby(hobby);
                  Map<String, String> gift = new HashMap<>();
                  gift.put("情人節(jié)禮物""LBR 1912女王時(shí)代");
                  gift.put("生日禮物""迪奧烈焰藍(lán)金");
                  gift.put("紀(jì)念日禮物""阿瑪尼紅管唇釉");
                  myGirlFriend.setGift(gift);
                  // 等等等等 ...
              }
          }
          GirlFriend{name='小美'
          , age=18
          , bust=33
          , waist=23
          , hips=33
          , hobby=[逛街, 購(gòu)物, 買(mǎi)東西]
          , birthday='2001-10-26'
          , address='上海浦東'
          , mobile='18688888888'
          , email='[email protected]'
          , hairColor='淺棕色帶點(diǎn)微卷'
          , gift={情人節(jié)禮物=LBR 1912女王時(shí)代, 生日禮物=迪奧烈焰藍(lán)金, 紀(jì)念日禮物=阿瑪尼紅管唇釉}
          }

          GirlFriend 是很美,但寫(xiě)起來(lái)也太麻煩了吧。

          說(shuō)說(shuō)缺點(diǎn):實(shí)例化和設(shè)置屬性分開(kāi),不好維護(hù);變量名重復(fù)寫(xiě)。

          莫慌,看法寶~

          這里不再介紹其他 Builder 實(shí)現(xiàn)方式,直接祭出最實(shí)用的通用Builder:

          適用于所有類(lèi),不需要改造原來(lái)類(lèi),不需要 lombok 插件支持。

          先看看使用姿勢(shì):

          public class GirlFriend {
              // 省略屬性 ...
              // 省略 getter & setter ...

              // 為了演示方便,加幾個(gè)聚合方法
              public void addHobby(String hobby) {
                  this.hobby = Optional.ofNullable(this.hobby).orElse(new ArrayList<>());
                  this.hobby.add(hobby);
              }
              public void addGift(String day, String gift) {
                  this.gift = Optional.ofNullable(this.gift).orElse(new HashMap<>());
                  this.gift.put(day, gift);
              }
              public void setVitalStatistics(int bust, int waist, int hips) {
                  this.bust = bust;
                  this.waist = waist;
                  this.hips = hips;
              }
              public static void main(String[] args) {
                  GirlFriend myGirlFriend = Builder.of(GirlFriend::new)
                          .with(GirlFriend::setName, "小美")
                          .with(GirlFriend::setAge, 18)
                          .with(GirlFriend::setVitalStatistics, 332333)
                          .with(GirlFriend::setBirthday, "2001-10-26")
                          .with(GirlFriend::setAddress, "上海浦東")
                          .with(GirlFriend::setMobile, "18688888888")
                          .with(GirlFriend::setEmail, "[email protected]")
                          .with(GirlFriend::setHairColor, "淺棕色帶點(diǎn)微卷")
                          .with(GirlFriend::addHobby, "逛街")
                          .with(GirlFriend::addHobby, "購(gòu)物")
                          .with(GirlFriend::addHobby, "買(mǎi)東西")
                          .with(GirlFriend::addGift, "情人節(jié)禮物""LBR 1912女王時(shí)代")
                          .with(GirlFriend::addGift, "生日禮物""迪奧烈焰藍(lán)金")
                          .with(GirlFriend::addGift, "紀(jì)念日禮物""阿瑪尼紅管唇釉")
                          // 等等等等 ...
                          .build();
              }
          }

          看到了嗎!實(shí)例化和屬性設(shè)置在同一條語(yǔ)句執(zhí)行,鏈?zhǔn)讲僮鳎宦伏c(diǎn)點(diǎn)點(diǎn),清爽!

          Talk is cheap, show me the code:

          /**
           * 通用的 Builder 模式構(gòu)建器
           *
           * @author: CipherCui
           * @since 2019/8/29
           */

          public class Builder<T{
              private final Supplier<T> instantiator;
              private List<Consumer<T>> modifiers = new ArrayList<>();
              public Builder(Supplier<T> instantiator) {
                  this.instantiator = instantiator;
              }
              public static <T> Builder<T> of(Supplier<T> instantiator) {
                  return new Builder<>(instantiator);
              }
              public <P1> Builder<T> with(Consumer1<T, P1> consumer, P1 p1) {
                  Consumer<T> c = instance -> consumer.accept(instance, p1);
                  modifiers.add(c);
                  return this;
              }
              public <P1, P2> Builder<T> with(Consumer2<T, P1, P2> consumer, P1 p1, P2 p2) {
                  Consumer<T> c = instance -> consumer.accept(instance, p1, p2);
                  modifiers.add(c);
                  return this;
              }
              public <P1, P2, P3> Builder<T> with(Consumer3<T, P1, P2, P3> consumer, P1 p1, P2 p2, P3 p3) {
                  Consumer<T> c = instance -> consumer.accept(instance, p1, p2, p3);
                  modifiers.add(c);
                  return this;
              }
              public T build() {
                  T value = instantiator.get();
                  modifiers.forEach(modifier -> modifier.accept(value));
                  modifiers.clear();
                  return value;
              }
              /**
               * 1 參數(shù) Consumer
               */

              @FunctionalInterface
              public interface Consumer1<TP1{
                  void accept(T t, P1 p1);
              }
              /**
               * 2 參數(shù) Consumer
               */

              @FunctionalInterface
              public interface Consumer2<TP1P2{
                  void accept(T t, P1 p1, P2 p2);
              }
              /**
               * 3 參數(shù) Consumer
               */

              @FunctionalInterface
              public interface Consumer3<TP1P2P3{
                  void accept(T t, P1 p1, P2 p2, P3 p3);
              }
          }

          這個(gè)示例最多支持三個(gè)參數(shù)的設(shè)置屬性方法,也完全夠用了。如果要擴(kuò)展也很容易,依葫蘆畫(huà)瓢,添加多個(gè)參數(shù)的Consumer。

          快用你的 Builder 建個(gè)對(duì)象吧~


          -End-

          最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來(lái),可以說(shuō)是程序員面試必備!所有資料都整理到網(wǎng)盤(pán)了,歡迎下載!

          點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

          在看點(diǎn)這里好文分享給更多人↓↓

          瀏覽 23
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  飘花影院一区二区 | 欧美一级另类 | 午夜激情福利视频 | 欧美丰满人妻免费视频人 | 精品无码产一区二区 |