摘要:方法鏈?zhǔn)窃O(shè)計(jì)提倡的的一種實(shí)現(xiàn),能夠提高代碼可讀性。這時候,使用構(gòu)造器模式反而降低了開發(fā)效率。
方法鏈(method chaining)是API設(shè)計(jì)提倡的fluent interface的一種實(shí)現(xiàn),能夠提高代碼可讀性。
當(dāng)一個類擁有很多屬性并且允許這些屬性擁有缺省值時,構(gòu)造對象往往會變得很麻煩。要么,會有一個很長的構(gòu)造方法,你需要記住每個參數(shù)的位置,并且在構(gòu)造時會顯式的傳入缺省值,比如:
public class Person{ String name; int age; char sex; String phone; String address; double salary; public Person(String name,int age,char sex,String phone,String address,double salary){ this.name=name; this.age=age; this.sex=sex; this.phone=phone; this.address=address; this.salary=salary; } //其他setter/getter方法 } Person person = new Person("劉杰", 18, "m", null, null);
或者,我們可以使用重載定義具有缺省值的構(gòu)造方法,但這會增加API的復(fù)雜性,同時降低代碼可讀性。另外,有時候參數(shù)順序也難以確定(后面的參數(shù)擁有缺省值),你無法重載擁有兩個完全相同參數(shù)列表的方法,甚至重載兩個參數(shù)個數(shù)相同的方法也是不推薦的,比如:
public Person(String name,String phone){} public Person(String name,String address){} // 編譯錯誤 public Person(String name,int age){} public Person(String name,double salary){} // 有點(diǎn)危險
通常,我們會使用構(gòu)造器模式來實(shí)現(xiàn)方法鏈調(diào)用,比如:
Person person = new PersonBuilder() .setName("劉杰") .setAge(18) .setSex("m") .setPhone("13333333") .build();
然而對大多數(shù)類來說,類生成的邏輯并不復(fù)雜,僅僅是將數(shù)據(jù)填充到相應(yīng)的字段上。這時候,使用構(gòu)造器模式反而降低了開發(fā)效率。因此,更好的實(shí)踐是:將返回void的方法改為返回this,尤其是Java Bean中的set方法:
public Person setName(String name){ this.name=name; return this; } Person person = new Person() .setName("劉杰") .setAge(18) .setSex("m") .setPhone("13333333");
當(dāng)使用了繼承,可能還會碰到一些麻煩:
public class Student extends Person{ String school; // school的setter/getter方法 } Student student = new Student() .setName("鄭浩") .setSchool("浙江大學(xué)"); // 編譯錯誤
解決上面的問題大概有兩種方法,第一種是重寫父類的方法:
// Java允許重寫方法返回原方法返回值的子類型 @Override public Student setName(String name){ super.setName(name); return this; }
第二種是使用泛型方法轉(zhuǎn)型,雖然會產(chǎn)生編譯警告,但可以少寫點(diǎn)代碼:
@SuppressWarnings("unchecked") publicT setName(String name){ this.name=name; return (T)this; } Student student = new Student() . setName("鄭浩") .setSchool("浙江大學(xué)");
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64798.html
摘要:通常,這種模式是通過定義一個代表處理對象的抽象類來實(shí)現(xiàn)的,在抽象類中會定義一個字段來記錄后續(xù)對象。工廠模式使用表達(dá)式第章中,我們已經(jīng)知道可以像引用方法一樣引用構(gòu)造函數(shù)。 一、為改善可讀性和靈活性重構(gòu)代碼 1.改善代碼的可讀性 Java 8的新特性也可以幫助提升代碼的可讀性: 使用Java 8,你可以減少冗長的代碼,讓代碼更易于理解 通過方法引用和Stream API,你的代碼會變得更...
摘要:表達(dá)式體現(xiàn)了函數(shù)式編程的思想,即一個函數(shù)亦可以作為另一個函數(shù)參數(shù)和返回值,使用了函數(shù)作參數(shù)返回值的函數(shù)被稱為高階函數(shù)。對流對象進(jìn)行及早求值,返回值不在是一個對象。 Java8主要的改變是為集合框架增加了流的概念,提高了集合的抽象層次。相比于舊有框架直接操作數(shù)據(jù)的內(nèi)部處理方式,流+高階函數(shù)的外部處理方式對數(shù)據(jù)封裝更好。同時流的概念使得對并發(fā)編程支持更強(qiáng)。 在語法上Java8提供了Lamb...
摘要:元素的位置通過以及屬性進(jìn)行規(guī)定。請求會向指定資源提交數(shù)據(jù),請求服務(wù)器進(jìn)行處理。無狀態(tài)通信的會話狀態(tài)應(yīng)該全部由客戶端負(fù)責(zé)維護(hù)。 HTML html5的新特性 文件類型聲明()僅有一型:。 新的解析順序:不再基于SGML。 繪畫 canvas; 用于媒介回放的 video 和 audio 元素; 語意化更好的內(nèi)容元素:article、footer、header、nav、section; ...
摘要:元素的位置通過以及屬性進(jìn)行規(guī)定。請求會向指定資源提交數(shù)據(jù),請求服務(wù)器進(jìn)行處理。無狀態(tài)通信的會話狀態(tài)應(yīng)該全部由客戶端負(fù)責(zé)維護(hù)。 HTML html5的新特性 文件類型聲明()僅有一型:。 新的解析順序:不再基于SGML。 繪畫 canvas; 用于媒介回放的 video 和 audio 元素; 語意化更好的內(nèi)容元素:article、footer、header、nav、section; ...
摘要:元素的位置通過以及屬性進(jìn)行規(guī)定。請求會向指定資源提交數(shù)據(jù),請求服務(wù)器進(jìn)行處理。無狀態(tài)通信的會話狀態(tài)應(yīng)該全部由客戶端負(fù)責(zé)維護(hù)。 HTML html5的新特性 文件類型聲明()僅有一型:。 新的解析順序:不再基于SGML。 繪畫 canvas; 用于媒介回放的 video 和 audio 元素; 語意化更好的內(nèi)容元素:article、footer、header、nav、section; ...
閱讀 3937·2021-11-22 13:54
閱讀 2708·2021-09-30 09:48
閱讀 2386·2021-09-28 09:36
閱讀 3139·2021-09-22 15:26
閱讀 1370·2019-08-30 15:55
閱讀 2535·2019-08-30 15:54
閱讀 1452·2019-08-30 14:17
閱讀 2364·2019-08-28 18:25