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