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