<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 對象嗎?Java8 通用 Builder 了解一下?

          共 11911字,需瀏覽 24分鐘

           ·

          2021-04-16 01:41

          程序員經常會遇到靈魂拷問:你有對象嗎?

          沒有,但我可以 new 一個!

          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);
              }
          }

          沒問題,老鐵!但如果對象的屬性太多,咋辦?

          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("淺棕色帶點微卷");
                  List<String> hobby = new ArrayList<>();
                  hobby.add("逛街");
                  hobby.add("購物");
                  hobby.add("買東西");
                  myGirlFriend.setHobby(hobby);
                  Map<String, String> gift = new HashMap<>();
                  gift.put("情人節(jié)禮物""LBR 1912女王時代");
                  gift.put("生日禮物""迪奧烈焰藍金");
                  gift.put("紀念日禮物""阿瑪尼紅管唇釉");
                  myGirlFriend.setGift(gift);
                  // 等等等等 ...
              }
          }
          GirlFriend{name='小美'
          , age=18
          , bust=33
          , waist=23
          , hips=33
          , hobby=[逛街, 購物, 買東西]
          , birthday='2001-10-26'
          , address='上海浦東'
          , mobile='18688888888'
          , email='[email protected]'
          , hairColor='淺棕色帶點微卷'
          , gift={情人節(jié)禮物=LBR 1912女王時代, 生日禮物=迪奧烈焰藍金, 紀念日禮物=阿瑪尼紅管唇釉}
          }

          GirlFriend 是很美,但寫起來也太麻煩了吧。

          說說缺點:實例化和設置屬性分開,不好維護;變量名重復寫。

          莫慌,看法寶~

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

          適用于所有類,不需要改造原來類,不需要 lombok 插件支持。

          先看看使用姿勢:

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

              // 為了演示方便,加幾個聚合方法
              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, "淺棕色帶點微卷")
                          .with(GirlFriend::addHobby, "逛街")
                          .with(GirlFriend::addHobby, "購物")
                          .with(GirlFriend::addHobby, "買東西")
                          .with(GirlFriend::addGift, "情人節(jié)禮物""LBR 1912女王時代")
                          .with(GirlFriend::addGift, "生日禮物""迪奧烈焰藍金")
                          .with(GirlFriend::addGift, "紀念日禮物""阿瑪尼紅管唇釉")
                          // 等等等等 ...
                          .build();
              }
          }

          看到了嗎!實例化和屬性設置在同一條語句執(zhí)行,鏈式操作,一路點點點,清爽!

          Talk is cheap, show me the code:

          /**
           * 通用的 Builder 模式構建器
           *
           * @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);
              }
          }

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

          快用你的 Builder 建個對象吧~

          來源:ciphermagic.cn/java8-builder.html

          關注公眾號【Java技術江湖】后回復“PDF”即可領取200+頁的《Java工程師面試指南》

          強烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點,不管是復習還是面試,都很實用。




          瀏覽 26
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美69视频 | 国产AV影院 | 五月天欧美色图 | 天堂sv在线播放 | 国产一级毛片视频 |