Scala Class、Case Class、Object、Case Object、Trait

Class、Object

Scala 的 Class 如同 Java 的 Class

Class 案例:

class Person {
  // 声明类的属性时,可以使用 _ 代表对应类型的默认值
  var name: String = _  // 默认为 Null
  var age: Int = _  // 默认为 0
}

Object 案例:

object PizzaUtils {
    def addTopping(p: Pizza, t: Topping): Pizza = ...
    def removeTopping(p: Pizza, t: Topping): Pizza = ...
    def removeAllToppings(p: Pizza): Pizza = ...
}
object FileUtils {
    def readTextFileAsString(filename: String): Try[String] = ...
    def copyFile(srcFile: File, destFile: File): Try[Boolean] = ...
    def readFileToByteArray(file: File): Try[Array[Byte]] = ...
}

Case Class、Case Object

Case Class 如同常规的类一样,具有用于对不可更改的数据进行建模的功能,及模式匹配。

Case Class 概念的主要优势是通过避免大量样板代码来简化开发,可以轻松地在模式匹配中使用 Case Class!

case class className(parameters)

Case Class 的特性:

🌟 Case Class 具有一个默认的 apply() 方法,用于管理对象的构造。

🌟 Case Class 具有 copy() 方法,用于在不改变参数的情况下创建同一实例的副本。

// 案例一:在不改变参数的情况下创建同一实例的副本
case class People (name: String, age: Int)
object Main
{
  def main(args: Array[String])
  {
    val s1 = People("张三", 18)

    println("Name is " + s1.name)
    println("Age is " + s1.age)
    val s2 = s1.copy()

    println("Copy Name " + s2.name)
    println("Copy Age " + s2.age)
  }
}
// 输出
Name is 张三
Age is 18
Copy Name 张三
Copy Age 18
// 案例二:创建具有改变属性的同一对象的副本
case class People (name: String, age: Int)
object Main
{
  def main(args: Array[String])
  {
    val s1 = People("张三", 18)

    println("Name is " + s1.name);
    println("Age is " + s1.age);
    val s2 = s1.copy(name = "李四")

    println("Copy Name is " + s2.name);
    println("Change Age is " + s2.age);
  }
}
// 输出
Name is 张三
Age is 18
Copy Name is 李四
Change Age is 18

🌟 即使没有 new 关键字,也可以创建 Case Class 的对象

case class People(name: String, age: Int)
object Main
{
  def main(args: Array[String]): Unit = {

    val people1 = People("张三", 18)
    val people2 = People("李四", 20)

    println(s"Name is ${people1.name}   Age is ${people1.age}")
    println(s"Name is ${people2.name}   Age is ${people2.age}")
  }
}
// 输出
Name is 张三   Age is 18
Name is 李四   Age is 20

默认情况下,Scala 编译器会向字符串添加 equalsapplyunapply 方法的伴生对象,因此不需要 new 关键字来构造 Case Class 的对象。

默认情况下,Scala编译器为构造函数的所有参数添加了val或**var,**因此,一旦构造了该类对象,我们将无法为它们重新分配新值,这就是为什么即使没有val或var,Case Class 的构造函数参数也会变成类成员,

Case Object

Case Object 如同 Object,但它比常规的对象具有更多的属性、功能,它是 Case Class、Object 的混合体。

Case Object 的特征:

  • 它是可序列化的
  • 它具有默认的 hashCode
  • 它具有 toString 的实现

Case Object 的使用场景:

  • 创建枚举

    // 创建枚举
    sealed trait Topping
    case object Cheese extends Topping
    case object Pepperoni extends Topping
    case object Sausage extends Topping
    case object Mushrooms extends Topping
    case object Onions extends Topping
    
    sealed trait CrustSize
    case object SmallCrustSize extends CrustSize
    case object MediumCrustSize extends CrustSize
    case object LargeCrustSize extends CrustSize
    
    sealed trait CrustType
    case object RegularCrustType extends CrustType
    case object ThinCrustType extends CrustType
    case object ThickCrustType extends CrustType
    
    // 使用枚举
    case class Pizza (
        crustSize: CrustSize,
        crustType: CrustType,
        toppings: Seq[Topping]
    )
    
  • 创建为其他对象之间传递“信息”的容器时使用

    // 为信息创建单例对象
    case class StartSpeakingMessage(textToSpeak: String)
    case object StopSpeakingMessage
    case object PauseSpeakingMessage
    case object ResumeSpeakingMessage
    
    // 将其定义在 case class 中,是由于 Case Object 不能有构造函数参数
    

相关区别

Class、Object 区别:

  1. 单例对象不能带参数,类可以
  2. 对象可以和类名一样时,object被称为伴生对象,class被称为伴生类;
  3. 类和伴生对象可以相互访问其私有属性,但是它们必须在一个源文件当中;
  4. 类只会被编译,不会被执行。要执行,必须在Object中。

Case Class 、 Class 区别:

  1. 初始化的时候可以不用new,也可以加上,但是普通类必须加new;
  2. 默认实现了equals、hashCode方法;
  3. 默认是可以序列化的,实现了Serializable;
  4. 自动从scala.Product中继承一些函数;
  5. case class 构造函数参数是public的,我们可以直接访问;
  6. case class默认情况下不能修改属性值;
  7. case class最重要的功能,支持模式匹配,这也是定义case class的重要原因。

Case Class、Case Object 区别:

类中有参和无参,当类有参数的时候,用case class ,当类没有参数的时候那么用case object。

引自:Scala中class、object、case class、case object区别 - 时光快照 - 博客园 (cnblogs.com)

Trait

跳转文章: Scala 特质(Trait)

 


❤️ END ❤️
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值