博客
关于我
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 中开启二进制日志(Binlog)
    查看>>
    MySQL 中文问题
    查看>>
    MySQL 中日志的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    Mysql 优化 or
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>