一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java構建對象常用3種方法解析

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

2020-09-08 00:20碼農小胖哥 Java教程

這篇文章主要介紹了Java構建對象常用3種方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

當我們面對具有大量可選成員變量的 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方法進行目標對象的初始化。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
}

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

?
1
2
3
4
5
6
UserInfo userInfo = new UserInfo.Builder()
    .username("felord.cn")
    .address("xxxxxx")
    .age(28)
    .addTime(LocalDateTime.now())
    .build();

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

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

總結

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.51cto.com/14901317/2523043

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产品精人成福利视频 | 国产欧美一区二区三区久久 | 视频一区在线观看 | 亚洲品质自拍视频网站 | free chinese麻豆| 欧美人体高清在线观看ggogo | 视频一区精品 | pppd在线播放| 亚洲久操 | 九九影院午夜理论片无码 | 国产手机在线αⅴ片无码观看 | 色五婷婷 | 麻豆在线md0087免费 | 日韩精品亚洲一级在线观看 | 亚洲人成激情在线播放 | 羞羞私人影院可以直接免费观影吗 | 免费在线视频网站 | 亚洲高清在线天堂精品 | 国产精品一区二区不卡的视频 | 久久99热在线观看7 久久99精品涩AV毛片观看 | 国产精品第一 | 人与动人物人a级特片 | 2022色婷婷综合久久久 | 国产一区二区三区福利 | 亚洲欧美日韩在线观看看另类 | 欧美人禽杂交在线视频 | 免费一级特黄特色大片在线 | 99精品99 | 久草在线福利资站免费视频 | 色小孩导航| 国人精品视频在线观看 | 好紧好爽的午夜寂寞视频 | 大伊香蕉精品视频一区 | 亚洲 日韩 自拍 视频一区 | 成人在线免费观看视频 | 亚州在线视频 | 国产一久久香蕉国产线看观看 | 男人与雌性宠物交啪啪小说 | 久久久WWW免费人成精品 | 99久久精品免费看国产一区 | 亚洲精品第五页 |