成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

aervon / 3485人閱讀

摘要:方法鏈?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")
public  T 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

相關(guān)文章

  • java 8 實(shí)戰(zhàn)》讀書筆記 -第八章 重構(gòu)、測試和調(diào)試

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

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

    摘要:表達(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...

    gaara 評論0 收藏0
  • 前端面試問題總結(jié)

    摘要:元素的位置通過以及屬性進(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; ...

    qiangdada 評論0 收藏0
  • 前端面試問題總結(jié)

    摘要:元素的位置通過以及屬性進(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; ...

    siberiawolf 評論0 收藏0
  • 前端面試問題總結(jié)

    摘要:元素的位置通過以及屬性進(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; ...

    cloud 評論0 收藏0

發(fā)表評論

0條評論

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