【Java】子類的鏈式調用

来源:http://www.cnblogs.com/quiet-snowy-day/archive/2016/11/23/6091233.html
-Advertisement-
Play Games

記錄最近在項目設計中遇到的一個小問題。 前提:有這樣兩個POJO類,它們都可以通過鏈式調用的方式來設置其屬性值,其中一個類繼承了另一個類。 問題:通過鏈式調用,子類對象訪問父類方法後,如何使返回對象仍是子類對象,仍然可以繼續鏈式調用子類的方法? 結論:子類重寫父類中需要被調用的方法。在子類重寫的方法 ...


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

前提:有這樣兩個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     @Override
39     public AppearanceOption setId(String id) {
40         super.setId(id);
41         return this;
42     }
43 
44     @Override
45     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 的源碼就知道了。

 

 


由此想到的幾個問題,先留坑,想明白之後再來補充……

1.什麼情況下適合採用這種鏈式的方法調用?

2.對於項目來說,採用這種繼承結構是否合理?是否設計過度?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們在用eclipse EE neon創建dynamic web project時,如果你發現底部狀態欄一直卡在installing dynamic web module facet,永遠到不了100%,怎麼辦呢? 你可以嘗試一下斷開網路鏈接,然後再創建。 ...
  • 我們實現文件上傳 用位元組流的話代碼量大 效率低下 所以springMVC為我們提供了自己的方法。 SpringMVC專門提供了CommonMultipartResolver組件實現文件上傳: maxUploadSize 文件最大限制,單位是byte maxInMemorySize 低於這個大小的文件 ...
  • 初始springMvc這個框架,非常的陌生,而且幸好公司是通過maven這個代碼管理工具,可以隨時添加依賴。解決了很多問題在以後深入開發中。 項目結構: 通過結構中,pom.xml這個文件其實就說明這個項目是通過maven構建的,pom.xml里是主要負責構建jar或者war的依賴。其代碼如下: 從 ...
  • 在我們開發項目中的時候經常使用到svn,有時候我們commit的時候回出現很多無用的文件,這些文件就是未版本化的文件,怎麼解決這些亂文件的問題呢? svn commit提交的時候有個“show unversioned files” 顯示未版本化的文件 點擊前面的checkbox取消就可以了。 ...
  • 如果有很強勁的邏輯能力,或者是構思已久的話,你可以寫一個很複雜的表達式,但為了使代碼方便閱讀,最好一個表達式不要超過3個運算符。(這裡的語句,並不包含代碼塊),使用自增或者自減看起會更專業一些,但是要知道++在前與在後的區別,根據位置就可以清楚知道,++在前就先自加一,++在後就是用過之後再加一。 ...
  • 使用Eclipse把java文件打包成jar 含有第三方jar庫的jar包   網上打包說用eclipse安裝fat jar插件,但是貌似現在都不能用了,所以我只能按照eclipse自帶的方法打包了。但是。。。網上的各自辦法都有些問題,並且是不包含第三方jar包的打包方法,結合網 ...
  • Introduction To Obejct ___ The progress of abstraction + But their primary abstraction still requires you to think in terms of the structure of the co ...
  • 今日問題: 請問主程式輸出結果是什麼?(點擊以下“【Java每日一題】20161123”查看20161122問題解析) 題目原發佈於公眾號、簡書:【Java每日一題】20161123,【Java每日一題】20161123 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...