博客
关于我
scala单例object与伴生object入门
阅读量:655 次
发布时间:2019-03-15

本文共 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}

伴生对象(Companion Objects)

在 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/

    你可能感兴趣的文章
    mysql基础教程二
    查看>>
    mysql基础教程四 --连接查询
    查看>>
    MySQL基础知识:创建MySQL数据库和表
    查看>>
    MySQL基础系列—SQL分类之一
    查看>>
    MySQL处理千万级数据分页查询的优化方案
    查看>>
    mysql备份
    查看>>
    mysql备份与恢复
    查看>>
    mysql备份工具xtrabackup
    查看>>
    mysql备份恢复出错_尝试备份/恢复mysql数据库时出错
    查看>>
    mysql复制内容到一张新表
    查看>>
    mysql复制表结构和数据
    查看>>
    mysql复杂查询,优质题目
    查看>>
    MySQL外键约束
    查看>>
    MySQL多表关联on和where速度对比实测谁更快
    查看>>
    MySQL多表左右连接查询
    查看>>
    mysql大批量删除(修改)The total number of locks exceeds the lock table size 错误的解决办法
    查看>>
    mysql如何做到存在就更新不存就插入_MySQL 索引及优化实战(二)
    查看>>
    mysql如何删除数据表,被关联的数据表如何删除呢
    查看>>
    MySQL如何实现ACID ?
    查看>>
    mysql如何记录数据库响应时间
    查看>>