📜  斯卡拉 |案例类和案例对象

📅  最后修改于: 2022-05-13 01:54:26.186000             🧑  作者: Mango

斯卡拉 |案例类和案例对象

案例类说明


案例类就像一个普通类,它具有对不可更改数据进行建模的功能。它在模式匹配中也是建设性的。它已经用修饰符定义了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 编译器默认为构造函数的所有参数附加valvar ,因此,一旦构造了类对象,我们将无法为它们重新分配新值,这就是为什么即使没有 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 中消除。