本文共 2219 字,大约阅读时间需要 7 分钟。
Scala中的object
是一个特殊的概念,主要用于创建单例对象。单例对象的特点是只有一个实例,并且在第一次使用时才被懒加载。这对于一个没有static
关键字的语言来说,提供了一种类似于静态类的方式来管理对象。
当一个object
定义在顶层(即不属于其他类或者方法的内部)时,它自动成为一个单例对象。这意味着这个对象在整个程序中只有一个实例。例如:
object Logger1 { def info(msg: String): Unit = println(s"INFO: $msg")}class MID { // 单例对象的方法可以像 Java 中静态类的方法一样调用 Logger1.info("创建对象")}object Test2 { def main(args: Array[String]): Unit = { Logger1.info("hello, world") // INFO: hello, world val m = new MID() // INFO: 创建对象 }}
当两个object
定义在同一个顶层时,它们是独立的单例对象,各自有一个实例。
object
确实是一个单例object Test extends App { // 这个对象自己返回自己作为单例实例 private val singleton1: Singleton.type = Singleton.getInstance() private val singleton2: Singleton.type = Singleton.getInstance() assert(singleton1 == singleton2) // true}object Singleton { val singleton: Singleton.type = singleton def getInstance(): Singleton.type = singleton}
在 Scala 中,一个object
如果与一个名为相同的class
在同一个源文件中,并且使用object
修饰这一object
,那么它就是一个伴生对象。伴生对象和伴生类之间可以互相访问对方的私有属性和方法,无论是私有还是公有的。
例如:
class Companion { var id = 0 private val name = "xiaohong" private[this] var age = 18 private def getAge: Int = age}object Companion { private val address = "beijing" def main(args: Array[String]): Unit = { val co = new Companion() co.id = 1 println(co.id) // 1 println(co.name) // xiaohong println(co.getAge) // 18 co.getAddress() // beijing }}
apply
方法在伴生对象中的使用在伴生对象中定义apply
方法,可以简化对象创建的方式,类似于 Java 中的静态工厂方法。例如:
object Test extends App { // 传参直接传给 apply 方法 val m = Man("李明", 20) m.showInfo() // 李明是 20 岁}class Man(private val name: String, val age: Int) { def showInfo(): Unit = { println(s"${name} is ${age} years old") }}object Man { def apply(name: String, age: Int): Man = new Man(name, age)}
对于case class
,Scala会自动为其伴生对象生成一个apply
方法。
App
对象的使用App
对象可以让一个 Scala 脚本不需要main
方法就可以执行。这类object
通常用于脚本编写和简单的 CLI 应用程序。
例如:
object HelloApp extends App { println("hello world") // 输出 hello world}
总结:
static
关键字时管理单例实例。class
在同一个源文件中,可以互相访问私有属性和方法。apply
方法:用于工厂模式,简化对象创建过程,无需写new
关键字。case class
和伴生对象的默认行为:case class
自动提供apply
方法和等等方法,简化对象操作。通过合理使用这些特性,可以更高效地组织和管理 Scala 代码。
转载地址:http://lnsmz.baihongyu.com/