Scala中的样例类和样例对象
在 Scala 中,样例类(case class)和样例对象(case object)都是用于定义不可变数据类型的特殊类和对象。它们被广泛用于模式匹配、代数数据类型(Algebraic Data Types)的定义以及函数式编程中。
下面分别介绍样例类和样例对象的特点和用法:
-
样例类(case class):
- 样例类是一种特殊的类,使用
case class
关键字进行定义。 - 样例类默认会自动生成一些方法,如构造函数、
equals
、hashCode
、toString
、copy
等。 - 样例类的构造参数默认是不可变的,即无法在实例化后修改。
- 样例类在模式匹配中非常有用,可以方便地进行结构解析和提取。
- 样例类可以有成员变量,可以通过模式匹配和属性访问的方式来获取。
以下是一个样例类的示例:
case class Person(name: String, age: Int) val person = Person("Alice", 30) println(person.name) // 输出 "Alice"
- 样例类是一种特殊的类,使用
-
样例对象(case object):
- 样例对象是单例的对象,使用
case object
关键字进行定义。 - 样例对象没有构造参数,因为它本身就是单例对象。
- 样例对象默认自带了
toString
、equals
和hashCode
方法。 - 样例对象在模式匹配中也非常有用,可以方便地被用作标记或特定情况的表示。
以下是一个样例对象的示例:
case object MyObject
样例对象本质上是一个类的实例,但只有一个全局唯一的实例可供访问。它通常用于表示特定的状态或行为,而无需创建多个实例。
- 样例对象是单例的对象,使用
通过使用样例类和样例对象,可以轻松定义和使用不可变数据类型,并且利用模式匹配等功能强大的特性来处理数据。
JAVA存根类
存根类是一个类,它实现了一个接口,它的作用是:如果一个接口有很多方法,如果要实现这个接口,就要实现所有的方法。但是一个类从业务来说,可能只需要其中一两个方法。如果直接去实现这个接口,除了实现所需的方法,还要实现其他所有的无关方法。而如果通过继承存根类就实现接口,就免去了这种麻烦。
RMI 采用stubs 和 skeletons 来进行远程对象(remote object)的通讯。stub 充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的。
每个远程对象都包含一个代理对象stub,当运行在本地Java虚拟机上的程序调用运行在远程Java虚拟机上的对象方法时,它首先在本地创建该对象的代理对象stub, 然后调用代理对象上匹配的方法。每一个远程对象同时也包含一个skeleton对象,skeleton运行在远程对象所在的虚拟机上,接受来自stub对象的调用。这种方式符合等到程序要运行时将目标文件动态链接的思想。