摘要:更多關(guān)于的文章請戳這里您的留言意見是對我最大的支持我的文章列表
在實例化一個類的過程中,通常會遇到多個參數(shù)的構(gòu)造函數(shù),但如果有些參數(shù)是非必需的呢?每次都要初始化那么多參數(shù)么?
public class Person { private int id;//身份證號 private String name;//姓名 private int age;//年齡 private boolean sex;//性別 private String desc;//個人描述 public Person(int id, String name, int age, boolean sex, String desc) { this.id = id; this.name = name; this.age = age; this.sex = sex; this.desc = desc; } }
或者像下面這樣,創(chuàng)建一個必選參數(shù)的構(gòu)造器,在創(chuàng)建幾個可選參數(shù)的構(gòu)造器?
public Person(int id, String name) {//兩個參數(shù)的 this.id = id; this.name = name; } public Person(int id, String name, int age) {//三個參數(shù)的 this.id = id; this.name = name; this.age = age; } public Person(int id, String name, int age, boolean sex) {//四個參數(shù)的 this.id = id; this.name = name; this.age = age; this.sex = sex; }
或setter方法?
JavaBean模式自身有嚴(yán)重的缺點,因為構(gòu)造過程被分到幾個調(diào)用中,在構(gòu)造過程中Javabean可能處于不一致的狀態(tài),類無法僅僅通過檢驗構(gòu)造器參數(shù)的有效性來保證一致性。JavaBean模式阻止了把類做成不可變的可能,這就需要程序員付出額外的努力確保線程安全 ---摘自Effective Java
那么我們該怎樣用構(gòu)建器來實現(xiàn)類的實例化而又不受制于構(gòu)造函數(shù)限制呢?
public class Person { private final int id;//身份證號 private final String name;//姓名 private int age;//年齡 private boolean sex;//性別 private String desc;//個人描述 private Person(Builder builder){ this.id=builder.id; this.name=builder.name; this.age=builder.age; this.sex=builder.sex; this.desc=builder.desc; } public static class Builder{ private final int id; private final String name; private int age; private boolean sex; private String desc; public Builder(int id, String name) { this.id = id; this.name = name; } public Builder age(int age){ //年齡合法性檢查 if(age<0)throw new IllegalArgumentException(); else this.age=age; return this; } public Builder sex(boolean sex){ this.sex=sex; return this; } public Builder desc(String desc){ this.desc=desc; return this; } public Person build(){ return new Person(this); } } @Override public String toString() { return "id:"+this.id+" 姓名:"+this.name+" 年齡:"+this.age+" 性別:"+this.sex+" 描述:"+this.desc; } }
我們在main函數(shù)中測試一下
public static void main(String[] args) { Builder builder=new Person.Builder(123,"張三"); Person person=builder.age(18).sex(false).desc("好好學(xué)習(xí),天天向上").build(); System.out.println(person.toString()); }
用構(gòu)建器創(chuàng)建的實例易于閱讀和編寫,較javaBean模式又更加安全,自然,自然,每種方法都會有其優(yōu)點和弊端,選擇合適的使用場景,會讓代碼更加健壯易讀。
我的文章列表
Email:sxh13208803520@gmail.com
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/66957.html
摘要:因此,最好一開始就考慮使用構(gòu)造器。與使用傳統(tǒng)的重疊構(gòu)造器模式相比,使用模式的客戶端代碼更易于閱讀和編寫,構(gòu)建器也比更加安全。 ??靜態(tài)工廠和構(gòu)造器有個共同的局限性:他們都不能很好地擴展到大量的可選參數(shù)??紤]用一個類表示包裝食品外面顯示的營養(yǎng)成分標(biāo)簽。這些標(biāo)簽中有幾個域是必需的:每份的含量、每罐的含量以及每份的卡路里,還有超過20個可選域:總脂肪、飽和脂肪量、轉(zhuǎn)化脂肪、膽固醇、鈉等等。大...
摘要:遵循特定規(guī)則,利用操作符,終止節(jié)點和其他非終止節(jié)點,構(gòu)造新的字符串非終結(jié)符是表示字符串的樹的內(nèi)部節(jié)點。語法中的生產(chǎn)具有這種形式非終結(jié)符終結(jié),非終結(jié)符和運算符的表達式語法的非終結(jié)點之一被指定為根。 大綱 基于狀態(tài)的構(gòu)建 基于自動機的編程 設(shè)計模式:Memento提供了將對象恢復(fù)到之前狀態(tài)的功能(撤消)。 設(shè)計模式:狀態(tài)允許對象在其內(nèi)部狀態(tài)改變時改變其行為。 表驅(qū)動結(jié)構(gòu)* 基于語法的構(gòu)...
StringBuilder類 StringBuilder對象與String對象類似,只是它可以被修改,在內(nèi)部,這些對象被視為包含一系列字符的可變長度數(shù)組,在任何時候,可以通過方法調(diào)用來改變序列的長度和內(nèi)容。 除非字符串構(gòu)建器在更簡單的代碼(參見本節(jié)末尾的示例程序)或更好的性能方面提供優(yōu)勢,否則應(yīng)始終使用字符串,例如,如果需要連接大量字符串,則附加到StringBuilder對象會更有效。 長度和容...
摘要:類模擬實現(xiàn)類的基本結(jié)構(gòu)結(jié)點類成員變量成員函數(shù)迭代器類成員函數(shù)解引用運算符重載箭頭運算符重載迭代器前置迭代器后置迭代器的比較鏈表類成員變量成員函數(shù)構(gòu)造函數(shù)拷貝構(gòu)造賦值重載析構(gòu)函數(shù)其他小型接口類的基本結(jié)構(gòu)中是一個雙向帶頭循環(huán)鏈表。 ...
閱讀 2737·2021-09-23 11:21
閱讀 1963·2021-09-22 15:15
閱讀 1150·2021-09-10 11:27
閱讀 3515·2019-08-30 15:54
閱讀 724·2019-08-30 15:52
閱讀 1391·2019-08-30 15:44
閱讀 2416·2019-08-29 15:06
閱讀 3053·2019-08-28 18:21