最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java構(gòu)建對象常用3種方法解析

 更新時間:2020年09月07日 08:31:45   作者:碼農(nóng)小胖哥  
這篇文章主要介紹了Java構(gòu)建對象常用3種方法解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

當(dāng)我們面對具有大量可選成員變量的 Java 類時,創(chuàng)建這些對象的最佳方法是什么?通常有三種方法: 伸縮構(gòu)造函數(shù),JavaBean模式和構(gòu)建器模式。

構(gòu)造函數(shù)

UserInfo userInfo1 = new UserInfo("felord.cn", 28);
UserInfo xxxxxx = new UserInfo("felord.cn", "xxxxxx", 28);
UserInfo xxxxxx1 = new UserInfo("felord.cn", "xxxxxx", 28, LocalDateTime.now());

構(gòu)造函數(shù)通常需要可伸縮性,也就是參數(shù)列表需要重載。有些時候我不得不傳入null進行初始化。

// 不合理的構(gòu)造使用示范
UserInfo xxxxxx = new UserInfo(null, null, 28);

而且不能直觀看出這些參數(shù)所代表的的含義,這有可能引發(fā)致命的錯誤,我們將同類型的username和address互換位置依然成功初始化了對象,不會顯式的引發(fā)構(gòu)建錯誤,這是不合理的。

IDEA 參數(shù)列表提示功能

另外如果參數(shù)列表比較長,有七八個的話,代碼是非常冗長的。

難道構(gòu)造函數(shù)一無是處嗎,當(dāng)然不是。胖哥在使用構(gòu)造參數(shù)時會確保構(gòu)造的參數(shù)列表不會太長,而且如果參數(shù)是可選的話,不會將其置于構(gòu)造函數(shù)中的。另外構(gòu)建不可變對象使用構(gòu)造函數(shù)也是極好的。

JavaBean

這種方式是最常用的創(chuàng)建對象的方法。只需要使用無參構(gòu)造函數(shù),然后為每個成員變量設(shè)置setter方法。

UserInfo userInfo = new UserInfo();

userInfo.setUsername("felord.cn");
userInfo.setAge(28);

這種方式之所以使用非常普遍是因為很多知名框架需要你采用這種模式,比如JSON類庫Jackson、Spring Framework還有絕大部分的ORM框架。

大多數(shù)情況下這種方式是可以勝任的。它的缺點在于我們需要兩步來完成對象的創(chuàng)建工作,另外它缺乏創(chuàng)建不可變對象的能力。

構(gòu)建器

構(gòu)建器其實在我之前的文章多次用到,Spring Security對HttpSecurity的配置就用到了該模式。構(gòu)建器不僅獲得了伸縮構(gòu)造函數(shù)的安全性,而且可讀性更好。

我們需要在目標(biāo)對象(這里是UserInfo)內(nèi)部創(chuàng)建了一個靜態(tài)類,通常簡單地稱為Builder。Builder聲明了一系列方法來設(shè)置對象屬性的值,然后將其返回Builder本身,完成所有調(diào)用后,我們調(diào)用Builder的無參build方法進行目標(biāo)對象的初始化。

public class UserInfo {
  private String username;
  private String address;
  private Integer age;
  private LocalDateTime addTime;

  // 私有化無參構(gòu)造
  private UserInfo() {
  }

  public static class Builder {
    private String username;
    private Integer age;
    private String address;
    private LocalDateTime addTime;

    public Builder username(String username) {
      this.username = username;
      return this;
    }

    public Builder address(String address) {
      this.address = address;
      return this;
    }

    public Builder age(Integer age) {
      this.age = age;
      return this;
    }

    public Builder addTime(LocalDateTime addTime) {
      this.addTime = addTime;
      return this;
    }

    public UserInfo build() {
      UserInfo userInfo = new UserInfo();

      userInfo.username = this.username;
      userInfo.address = this.address;
      userInfo.age = this.age;
      userInfo.addTime = this.addTime;

      return userInfo;
    }
  }
  // 省略 getter
}

然后初始化對象就可以這么寫:

UserInfo userInfo = new UserInfo.Builder()
    .username("felord.cn")
    .address("xxxxxx")
    .age(28)
    .addTime(LocalDateTime.now())
    .build();

這種寫法首先很流暢,而且可讀性更高,同時靈活度也得到了保證,可選參數(shù)更易處理。但是這種模式增加了我們代碼的書寫難度,需要進行一些額外的定義。當(dāng)然你可以借助于Lombok框架的@Builder注解來直接使用構(gòu)建器模式,但是不是每個人都喜歡Lombok。

由于常用的第三方框架的原因,這種寫法的使用場景并不是那么寬泛。通常在定義一些配置時使用它??蓞⒖荚谶@篇文章的做法。

總結(jié)

在Java日常開發(fā)中構(gòu)造函數(shù)和JavaBean是我們最常用的創(chuàng)建對象的手段,構(gòu)建器的適用場景相對少了一些,但是在定義一些配置的時候還是非常有用的。好了今天就聊到這里,希望對你有所幫助。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot如何集成websocket

    Springboot如何集成websocket

    這篇文章主要介紹了Springboot如何集成websocket問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 詳解 Java HashMap 實現(xiàn)原理

    詳解 Java HashMap 實現(xiàn)原理

    這篇文章主要介紹了詳解 Java HashMap 實現(xiàn)原理的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 使用springmvc臨時不使用視圖解析器的自動添加前后綴

    使用springmvc臨時不使用視圖解析器的自動添加前后綴

    這篇文章主要介紹了使用springmvc臨時不使用視圖解析器的自動添加前后綴,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • elasticsearch通過guice注入Node組裝啟動過程

    elasticsearch通過guice注入Node組裝啟動過程

    這篇文章主要為大家介紹了?elasticsearch通過guice注入Node組裝啟動過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Java創(chuàng)建線程的方式解析

    Java創(chuàng)建線程的方式解析

    這篇文章主要介紹了Java創(chuàng)建線程的方式解析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-07-07
  • 詳解Swagger接口文檔和常用注解的使用

    詳解Swagger接口文檔和常用注解的使用

    Swagger是一款遵循?Restful?風(fēng)格的接口文檔開發(fā)神器,支持基于?API?自動生成接口文檔。本文將為大家講講Swagger接口文檔和常用注解的使用方法,需要的可以參考一下
    2022-08-08
  • SpringBoot詳細講解如何創(chuàng)建及刷新Spring容器bean

    SpringBoot詳細講解如何創(chuàng)建及刷新Spring容器bean

    前面看spring源碼時可以發(fā)現(xiàn)refresh()方法十分重要。在這個方法中會加載beanDefinition,同時創(chuàng)建bean對象。那么在springboot中有沒有使用這個refresh()方法呢
    2022-06-06
  • 淺談Spring IoC容器的依賴注入原理

    淺談Spring IoC容器的依賴注入原理

    這篇文章主要介紹了淺談Spring IoC容器的依賴注入原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決

    Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決

    這篇文章主要介紹了Spring TransactionalEventListener事務(wù)未提交讀取不到數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 一文搞懂接口參數(shù)簽名與驗簽(附含java python php版)

    一文搞懂接口參數(shù)簽名與驗簽(附含java python php版)

    這篇文章主要為大家介紹了java python php不同版的接口參數(shù)簽名與驗簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06

最新評論

通许县| 新兴县| 盖州市| 普陀区| 肃南| 内江市| 鹤岗市| 临桂县| 青冈县| 宜昌市| 边坝县| 肇源县| 六盘水市| 安泽县| 浦城县| 登封市| 云梦县| 梅州市| 达州市| 天等县| 邵东县| 济源市| 日照市| 嵊州市| 平潭县| 方城县| 黎川县| 通化县| 斗六市| 花莲市| 忻城县| 安远县| 东港市| 潞城市| 大厂| 巫溪县| 新余市| 滦南县| 屏东市| 衡阳市| 高雄县|