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 编译器会向字符串添加
equals
、apply
、unapply
方法的伴生对象,因此不需要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 区别:
- 单例对象不能带参数,类可以
- 对象可以和类名一样时,object被称为伴生对象,class被称为伴生类;
- 类和伴生对象可以相互访问其私有属性,但是它们必须在一个源文件当中;
- 类只会被编译,不会被执行。要执行,必须在Object中。
Case Class 、 Class 区别:
- 初始化的时候可以不用new,也可以加上,但是普通类必须加new;
- 默认实现了equals、hashCode方法;
- 默认是可以序列化的,实现了Serializable;
- 自动从scala.Product中继承一些函数;
- case class 构造函数参数是public的,我们可以直接访问;
- case class默认情况下不能修改属性值;
- case class最重要的功能,支持模式匹配,这也是定义case class的重要原因。
Case Class、Case Object 区别:
类中有参和无参,当类有参数的时候,用case class ,当类没有参数的时候那么用case object。
引自:Scala中class、object、case class、case object区别 - 时光快照 - 博客园 (cnblogs.com)
Trait
跳转文章: Scala 特质(Trait)