理论教育 Scala语言基础:单例类型示例

Scala语言基础:单例类型示例

时间:2023-11-24 理论教育 版权反馈
【摘要】:与例7-3所不同的是,例7-4中的setName、setAge方法的返回值类型为this.type,也即其返回结果的类型为单例类型。如结果所示,例7-4第5行、第10行的setName、setAge方法与例7-4第4行、第9行的setName、setAge方法,不同之处在于方法最后的返回值类型为this.type,它返回的是实际调用该方法的类型,这样例7-4中的第28行、第29行代码都能正常运行,Student对象在调用setName、setAge方法后返回的实际类型是Student类型,这样再调用setStudentNo方法时便不会编译出错。

Scala语言基础:单例类型示例

这种单例类型有什么用呢?最常用的应用场景就是方法的链式调用,先来看一下如果没有单例类型会有什么情况发生。如例7-2所示,当不涉及继承时,程序代码在进行方法链式调用时能够正常运行。该例中的Person类定义了两个方法,分别是setName、setAge代码中使用链式调用行后进行setName和setAge方法的调用。

【例7-2】无继承时的方法链式调用示例。

代码执行结果如下:

如结果所示,例7-2第19行代码在执行setAge方法后,返回的是对象本身的引用,其类型为Person,然后继续调用对象的setName方法,执行结果后返回的仍然是对象本身,最后打印时调用toString方法将结果输出。但当涉及继承时,便会产生问题,如例7-3所示。该例是存在继承关系时的链式调用,父类Person中有两个方法分别是setName和setAge,子类Student继承自Person,并在类中定义了setStudentNo方法,在使用子类Student时采用链式调用。

【例7-3】带继承时的方法链式调用示例。(www.daowen.com)

例7-3中的第29行会报错,错误提示为“value setStudentNo is not a member of Person”,这是因为Student对象调用完setName方法后已经变成了父类型,再调用setAge方法也不会有问题,但当调用setStudentNo方法时因为父类中不存在该方法,因此会报错。第31行代码之所以能够顺利运行,原因在于其先调用Sudent类中的setStudentNo方法,完成后再调用父类Person中的setName、setAge方法。这就引出了下面要讲的问题,在实际进行程序开发时方法的调用顺序不应该影响程序的正常运行,单例类型可以解决这一问题,如例7-4所示。与例7-3所不同的是,例7-4中的setName、setAge方法的返回值类型为this.type,也即其返回结果的类型为单例类型。

【例7-4】单例类型实现的方法链式调用示例。

代码执行结果如下。

如结果所示,例7-4第5行、第10行的setName、setAge方法与例7-4第4行、第9行的setName、setAge方法,不同之处在于方法最后的返回值类型为this.type,它返回的是实际调用该方法的类型,这样例7-4中的第28行、第29行代码都能正常运行,Student对象在调用setName、setAge方法后返回的实际类型是Student类型,这样再调用setStudentNo方法时便不会编译出错。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈