国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

Java構建對象常用3種方法解析

瀏覽:33日期:2022-08-25 14:04:45

前言

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

構造函數

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

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

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

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

Java構建對象常用3種方法解析IDEA 參數列表提示功能

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

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

JavaBean

這種方式是最常用的創建對象的方法。只需要使用無參構造函數,然后為每個成員變量設置setter方法。

UserInfo userInfo = new UserInfo();

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

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

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

構建器

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

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

public class UserInfo { private String username; private String address; private Integer age; private LocalDateTime addTime; // 私有化無參構造 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();

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

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

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 国产黄色a三级三级三级 | 成人18免费网 | 免费中文字幕在线 | 色综合久久久久久888 | 精品国产一级毛片 | 色综合久久久久久久 | 日本阿v精品视频在线观看 日本阿v视频在线观看高清 | 在线看毛片网站 | 欧美日韩亚洲综合另类ac | 亚洲自偷自拍另类12p | 亚洲精品韩国美女在线 | 99在线视频免费 | 久久久久久一级毛片免费野外 | 欧美在线观看一区二区三区 | 国内精品久久久久久久久 | 欧美叫床戏做爰无遮挡 | 成人区精品一区二区不卡亚洲 | 精品久久久久久久久免费影院 | 亚洲国产激情一区二区三区 | 国产高清精品自在久久 | 久青草视频在线 | 免费逼片 | 视频在线亚洲 | 日韩精品一区二区三区视频网 | 亚洲精品欧美精品一区二区 | 欧美日韩亚洲国产 | 日本免费小视频 | 七七国产福利在线二区 | 色悠久久久久综合网伊人男男 | 欧美xx在线观看 | 国产嫩草影院在线观看 | 成人的天堂 | 欧美丝袜xxxxx在线播放 | 久久人人草| 国产一区二区三区日韩欧美 | 成人一a毛片免费视频 | 精品久久久久久久久免费影院 | 国产v片成人影院在线观看 国产v片在线播放免费观 | 国产在线视频一区 | 亚洲第一区香蕉_国产a | 国产首页精品 |