斯卡拉 |案例类和案例对象
案例类说明
案例类就像一个普通类,它具有对不可更改数据进行建模的功能。它在模式匹配中也是建设性的。它已经用修饰符定义了case ,由于这个 case 关键字,我们可以获得一些好处,以阻止自己编写必须包含在许多地方而几乎没有更改的部分代码。正如我们在下面看到的,一个最小案例类需要关键字case class 、一个标识符和一个可能是空的参数列表。
句法:
Case class className(parameters)
注意: Case 类有一个默认的 apply() 方法来管理对象的构造。
案例对象说明
案例对象也像一个对象,它比普通对象具有更多的属性。它是案例类和对象的混合。案例对象比常规对象具有更多功能。
以下两个是case对象的重要特征:
- 它是可序列化的。
- 它有一个默认的 hashCode 实现。
例子 :
// Scala program of case class and case Object
case class employee (name:String, age:Int)
object Main
{
// Main method
def main(args: Array[String])
{
var c = employee("Nidhi", 23)
// Display both Parameter
println("Name of the employee is " + c.name);
println("Age of the employee is " + c.age);
}
}
输出:
Name of the employee is Nidhi
Age of the employee is 23
案例类/对象的一些好处
- Case Class 的最大好处之一是 Scala Compiler 附加了一个方法,该方法的名称具有与类定义中定义的相同数量的参数,因为即使没有关键字new 。
例子:// Scala program of case class and case Object // affix a method with the name of the class case class Book (name:String, author:String) object Main { // Main method def main(args: Array[String]) { var Book1 = Book("Data Structure and Algorithm", "cormen") var Book2 = Book("Computer Networking", "Tanenbaum") // Display strings println("Name of the Book1 is " + Book1.name); println("Author of the Book1 is " + Book1.author); println("Name of the Book2 is " + Book2.name); println("Author of the Book2 is " + Book2.author); } }
输出:Name of the Book1 is Data Structure and Algorithm Author of the Book1 is cormen Name of the Book2 is Computer Networking Author of the Book2 is Tanenbaum
- 第二个方便之处在于,Scala 编译器默认为构造函数的所有参数附加val或var ,因此,一旦构造了类对象,我们将无法为它们重新分配新值,这就是为什么即使没有 val 或 var, case 类的构造函数参数将变成类成员,这对于常规类是不可行的。
例子:
因此,重新分配是不可行的。 - Scala 编译器还在 case 类中附加了一个 copy() 方法,该方法用于创建相同对象的副本,更改某些参数或不更改它们。
示例:在不更改参数的情况下创建相同实例的副本。// Scala program of case class To create // a duplicate of same instance case class Student (name:String, age:Int) object Main { // Main method def main(args: Array[String]) { val s1 = Student("Nidhi", 23) // Display parameter println("Name is " + s1.name); println("Age is " + s1.age); val s2 = s1.copy() // Display copied data println("Copy Name " + s2.name); println("Copy Age " + s2.age); } }
输出:Name is Nidhi Age is 23 Copy Name Nidhi Copy Age 23
在这里,我们通过对 s1 对象使用复制方法创建了新对象 s2,而不更改 s1 对象的属性。
示例:创建具有更改属性的相同对象的副本。// Scala program of case class same object // with changing attributes case class Student (name:String, age:Int) object Main { // Main method def main(args: Array[String]) { val s1 = Student("Nidhi", 23) // Display parameter println("Name is " + s1.name); println("Age is " + s1.age); val s2 = s1.copy(age = 24) // Display copied and changed attributes println("Copy Name is " + s2.name); println("Change Age is " + s2.age); } }
输出:Name is Nidhi Age is 23 Copy Name is Nidhi Change Age is 24
在这里,您需要在复制方法中传递值。
- 默认情况下,Scala 编译器添加了 toString、equals 方法、带有 apply 和 unapply 方法的伴随对象,因此您不需要new关键字来构造 Case 类的对象。
注意:在 Scala 案例类中使用超过 22 个参数是不切实际的,但现在您可以在使用Scala 版本 2.11.1 的案例类中使用任意数量的参数。此限制已从此版本的 scala 中消除。