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