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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 无耻三级在线观看 | 三叶草私人研究所 | 91久操 | 精品日本三级在线观看视频 | 欧美性一区二区三区 | 91亚洲专区 | 国产精品资源在线观看网站 | 国产1区2区三区不卡 | 91入口免费网站大全 | 精品一区二区三区免费观看 | 美国复古性xxxx | 日本三级欧美三级人妇英文 | 日本精品中文字幕在线播放 | 亚洲一区 在线播放 | 好紧好爽的午夜寂寞视频 | 日本人和黑人一级纶理片 | 国产精品igao视频网网址 | 黄瓜污视频 | 国产精品午夜性视频网站 | 亚洲免费黄色网 | 精品视频一区二区三区免费 | 日本sss在线高清观看 | s8sp加密路线和免费路线首页 | 亚洲成人影院在线观看 | 五月天婷婷亚洲 | 视频在线观看一区二区三区 | 欧美成人中文字幕 | 国产精品久久久久久久久免费 | 99精品国产综合久久久久 | 男人操美女视频 | 精品国偷自产在线 | 久久久久久88色偷偷 | 午夜爱爱爱爱爽爽爽视频网站 | 色啪久久婷婷综合激情 | 亚洲国产在线播放 | 激情婷婷综合久久久久 | 亚洲精品一区二区三区在线播放 | 成人福利网站含羞草 | 奇米影视中文字幕 | 青青操在线 | 我与恶魔的h生活ova |