国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

改善Java方法鏈特性:使用this代替void作為方法返回值

aervon / 3458人閱讀

摘要:方法鏈是設計提倡的的一種實現,能夠提高代碼可讀性。這時候,使用構造器模式反而降低了開發效率。

方法鏈(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")
public  T setName(String name){
    this.name=name;
    return (T)this;
}

Student student = new Student()
                      .setName("鄭浩")
                      .setSchool("浙江大學");

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64798.html

相關文章

  • java 8 實戰》讀書筆記 -第八章 重構、測試和調試

    摘要:通常,這種模式是通過定義一個代表處理對象的抽象類來實現的,在抽象類中會定義一個字段來記錄后續對象。工廠模式使用表達式第章中,我們已經知道可以像引用方法一樣引用構造函數。 一、為改善可讀性和靈活性重構代碼 1.改善代碼的可讀性 Java 8的新特性也可以幫助提升代碼的可讀性: 使用Java 8,你可以減少冗長的代碼,讓代碼更易于理解 通過方法引用和Stream API,你的代碼會變得更...

    gclove 評論0 收藏0
  • Java8流特性和Lambda表達式

    摘要:表達式體現了函數式編程的思想,即一個函數亦可以作為另一個函數參數和返回值,使用了函數作參數返回值的函數被稱為高階函數。對流對象進行及早求值,返回值不在是一個對象。 Java8主要的改變是為集合框架增加了流的概念,提高了集合的抽象層次。相比于舊有框架直接操作數據的內部處理方式,流+高階函數的外部處理方式對數據封裝更好。同時流的概念使得對并發編程支持更強。 在語法上Java8提供了Lamb...

    gaara 評論0 收藏0
  • 前端面試問題總結

    摘要:元素的位置通過以及屬性進行規定。請求會向指定資源提交數據,請求服務器進行處理。無狀態通信的會話狀態應該全部由客戶端負責維護。 HTML html5的新特性 文件類型聲明()僅有一型:。 新的解析順序:不再基于SGML。 繪畫 canvas; 用于媒介回放的 video 和 audio 元素; 語意化更好的內容元素:article、footer、header、nav、section; ...

    qiangdada 評論0 收藏0
  • 前端面試問題總結

    摘要:元素的位置通過以及屬性進行規定。請求會向指定資源提交數據,請求服務器進行處理。無狀態通信的會話狀態應該全部由客戶端負責維護。 HTML html5的新特性 文件類型聲明()僅有一型:。 新的解析順序:不再基于SGML。 繪畫 canvas; 用于媒介回放的 video 和 audio 元素; 語意化更好的內容元素:article、footer、header、nav、section; ...

    siberiawolf 評論0 收藏0
  • 前端面試問題總結

    摘要:元素的位置通過以及屬性進行規定。請求會向指定資源提交數據,請求服務器進行處理。無狀態通信的會話狀態應該全部由客戶端負責維護。 HTML html5的新特性 文件類型聲明()僅有一型:。 新的解析順序:不再基于SGML。 繪畫 canvas; 用于媒介回放的 video 和 audio 元素; 語意化更好的內容元素:article、footer、header、nav、section; ...

    cloud 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<