【Java】子类的链式调用

记录最近在项目设计中遇到的一个小问题。

前提:有这样两个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 }

 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 }

此时,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 }

现在setId()方法返回的是AppearanceOption 对象,eclipse自动提示中可以看到子类的方法了。

从结论来看,并没有用到多么高深的技术,主要还是对面向对象特征的理解和运用。可是,在实际设计代码结构的时候愣是半天没想到。

主要的解决思路是来自Java源码的启发。在Java中,最常见的链式调用就是 StringBuffer、StringBuilder 类中的 append() 方法。我们可以通过连续的.append().append()方法来完成字符串的拼接。如果稍微熟悉源码,可能会知道 StringBuffer、StringBuilder 这两个类都继承自抽象类AbstractStringBuilder,该抽象类中也有append() 方法。答案显而易见了,查看一下 StringBuffer 或者 StringBuilder 的源码就知道了。

时间: 2024-10-12 07:27:46

【Java】子类的链式调用的相关文章

对照Java学习Swift--可选链式调用(Optional Chaining)

可选链式调用(Optional Chaining)是一种可以在当前值可能为nil的可选值上请求和调用属性.方法及下标的方法.如果可选值有值,那么调用就会成功:如果可选值是nil,那么调用将返回nil.多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil. swift这个功能设计的很好,不会报空指针异常,如果是在Java中,那个环节的对象为空,则报空指针异常,程序异常退出,swift则不会,会直接返回一个nil,很方便. 通过在想调用的属性.方法.或

如何学习Swift可空链式调用

今天我们一起来学习Swift可空链式调用.可空链式调用是一种可以请求和调用属性.方法以及下标的过程,它的可空体现在请求或调用的目标当前可能为nil.如果可空的目标有值,即调用就会成功:如果选择的目标为nil,即调用将返回nil.多个连续的调用可以被链接在一起形成一个调用链,如果其中任何一个节点为nil将导致整个链调用失败.    一.使用可空链式调用来强制展开    可空链的定义,即是在要调用非空的属性.方法.下标的可空值后面添加一个问号即可.特别的,可空链式调用的返回结果与原本的返回结果具有相

java中的链式编程

听到链式编程听陌生的,但是写出来就感觉其实很熟悉 1 package test; 2 3 public class Test { 4 String name; 5 String phone; 6 String mail; 7 String sex; 8 public Test setName(String name) { 9 this.name = name; 10 return this; 11 } 12 public Test setPhone(String phone) { 13 this

面向对象的链式调用

1. 对象的链式调用 function Chain(){ this.n=0;//属性不一定一开始的时候全部都要初始化 this.fn1=function(_obj){//this指向  new Chain()实例化的对象 alert(this.n++);//注意:alert(this.n++)与this.fn1中的this 不一定指向的对象是一样的 return this; } this.fn2=function(){//同上 alert(this.n++);//注意:alert(this.n+

进击的雨燕-------------可空链式调用

详情转自:http://wiki.jikexueyuan.com/project/swift/chapter2/07_Closures.html 可空链式调用(Optional Chaining)是一种可以请求和调用属性.方法及下标的过程,它的可空性体现于请求或调用的目标当前可能为空(nil).如果可空的目标有值,那么调用就会成功:如果选择的目标为空(nil),那么这种调用将返回空(nil).多个连续的调用可以被链接在一起形成一个调用链,如果其中任何一个节点为空(nil)将导致整个链调用失败.

在python中实现链式调用

用过jquery的一般都知道在jquery中可以链式调用,代码简洁优雅.比如$("a").addClass("test").show().html("foo");. 在redis-py中的pipeline中也可以链式调用,比如pipe.set('foo', 'bar').sadd('faz', 'baz').incr('auto_number').execute() . 那么究竟怎么实现的呢? 很简单,返回对象自己就行了,即return self

关于JavaScript中的setTimeout()链式调用和setInterval()探索

http://www.cnblogs.com/Wenwang/archive/2012/01/06/2314283.html http://www.cnblogs.com/yangjunhua/archive/2012/04/12/2444106.html 下面的参考:http://evantre.iteye.com/blog/1718777 1.选题缘起 在知乎上瞎逛的时候看到一个自问自答的问题: 知乎上,前端开发领域有哪些值得推荐的问答?,然后在有哪些经典的 Web 前端或者 JavaScr

JavaScript设计模式-8.链式调用

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript高级语法8-链式调用</title> 6 </head> 7 <body> 8 <div id="box"></div> 9 <script type="text/javas

链式调用

链式调用 不论是JavaScript还是C#程序,我们已经习惯了采用如下所示的"链式调用"的方式进行编程,这样确实会使我们的程序变得很精练. 1: new Foo() 2: .UseXxx() 3: .UseZzz() 4: .UseZzz() 5: .Invoke(); 采用这种链式调用方式的很多方法都是扩展方法,比如上面所示的UseXxx.UseYyy和UseXxx方法就是采用如下形式定义的扩展方法. 1: public interface IFoo 2: { 3: void In