【Java】子類的鏈式調用

來源:互聯網
上載者:User

標籤:alt   span   cli   src   .com   lips   nbsp   解決   xtend   

記錄最近在項目設計中遇到的一個小問題。

前提:有這樣兩個POJO類,它們都可以通過鏈式調用的方式來設定其屬性值,其中一個類繼承了另一個類。

問題:通過鏈式調用,子類對象訪問父類方法後,如何使返回對象仍是子類對象,仍然可以繼續鏈式調用子類的方法?

結論:子類重寫父類中需要被調用的方法。在子類重寫的方法中,首先通過super關鍵字調用父類方法,

        然後通過return this語句返回子類對象。

 

為了更具體、更形象的描述問題和解決辦法,上範例程式碼。 

BaseOption、AppearanceOption 是兩個實現了鏈式調用的POJO類,其中AppearanceOption 繼承自BaseOption。

 1 package com.practice.option; 2  3 public class BaseOption { 4  5     private String id; 6  7     private String name; 8  9     public String getId() {10         return id;11     }12 13     public String getName() {14         return name;15     }16 17     public BaseOption setId(String id) {18         this.id = id;19         return this;20     }21 22     public BaseOption setName(String name) {23         this.name = name;24         return this;25     }26 27 }
View Code
 1 package com.practice.option; 2  3 public class AppearanceOption extends BaseOption { 4  5     private String color; 6  7     private String shape; 8  9     private String size;10 11     public String getColor() {12         return color;13     }14 15     public String getShape() {16         return shape;17     }18 19     public String getSize() {20         return size;21     }22 23     public AppearanceOption setColor(String color) {24         this.color = color;25         return this;26     }27 28     public AppearanceOption setShape(String shape) {29         this.shape = shape;30         return this;31     }32 33     public AppearanceOption setSize(String size) {34         this.size = size;35         return this;36     }37 38 }
View Code

此時,AppearanceOption 類的對象調用父類的方法後,返回的是父類對象。

如,setId()方法返回的是BaseOption對象,eclipse自動提示中看不到子類的方法。

 

修改子類AppearanceOption 的代碼,重寫父類方法。

 1 package com.practice.option; 2  3 public class AppearanceOption extends BaseOption { 4  5     private String color; 6  7     private String shape; 8  9     private String size;10 11     public String getColor() {12         return color;13     }14 15     public String getShape() {16         return shape;17     }18 19     public String getSize() {20         return size;21     }22 23     public AppearanceOption setColor(String color) {24         this.color = color;25         return this;26     }27 28     public AppearanceOption setShape(String shape) {29         this.shape = shape;30         return this;31     }32 33     public AppearanceOption setSize(String size) {34         this.size = size;35         return this;36     }37     38     @Override39     public AppearanceOption setId(String id) {40         super.setId(id);41         return this;42     }43 44     @Override45     public AppearanceOption setName(String name) {46         super.setName(name);47         return this;48     }49 50 }
View Code

現在setId()方法返回的是AppearanceOption 對象,eclipse自動提示中可以看到子類的方法了。

從結論來看,並沒有用到多麼高深的技術,主要還是對物件導向特徵的理解和運用。可是,在實際設計代碼結構的時候愣是半天沒想到。

主要的解決思路是來自Java源碼的啟發。在Java中,最常見的鏈式調用就是 StringBuffer、StringBuilder 類中的 append() 方法。我們可以通過連續的.append().append()方法來完成字串的拼接。如果稍微熟悉源碼,可能會知道 StringBuffer、StringBuilder 這兩個類都繼承自抽象類別AbstractStringBuilder,該抽象類別中也有append() 方法。答案顯而易見了,查看一下 StringBuffer 或者 StringBuilder 的源碼就知道了。

 

 

【Java】子類的鏈式調用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.