java構造器和構建器
阿新 • • 發佈:2018-12-05
本文摘自:https://blog.csdn.net/wh2827991/article/details/79013115
在例項化一個類的過程中,通常會遇到多個引數的建構函式,但如果有些引數是非必需的呢?每次都要初始化那麼多引數麼?
public class Person { private int id;//身份證號 private String name;//姓名 private int age;//年齡 private boolean sex;//性別 private String desc;//個人描述 public Person(int id, String name, intage, 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模式又更加安全,自然,自然,每種方法都會有其優點和弊端,選擇合適的使用場景,會讓程式碼更加健壯易讀。
在例項化一個類的過程中,通常會遇到多個引數的建構函式,但如果有些引數是非必需的呢?每次都要初始化那麼多引數麼?
或者像下面這樣,建立一個必選引數的構造器,在建立幾個可選引數的構造器?
或setter方法?
JavaBean模式自身有嚴重的缺點,因為構造過程被分到幾個呼叫中,在構造過程中Javabean可能處於不一致的狀態,類無法僅僅通過檢驗構造器引數的有效性來保證一致性。JavaBean模式阻止了把類做成不可變的可能,這就需要程式設計師付出額外的努力確保執行緒安全 ---
摘自Effective Java
那麼我們該怎樣用構建器來實現類的例項化而又不受制於建構函式限制呢?