博客
关于我
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 用 limit 为什么会影响性能?
    查看>>
    MySQL 用 limit 为什么会影响性能?有什么优化方案?
    查看>>
    MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
    查看>>
    mysql 用户管理和权限设置
    查看>>
    MySQL 的 varchar 水真的太深了!
    查看>>
    mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
    查看>>
    MySQL 的instr函数
    查看>>
    MySQL 的mysql_secure_installation安全脚本执行过程介绍
    查看>>
    MySQL 的Rename Table语句
    查看>>
    MySQL 的全局锁、表锁和行锁
    查看>>
    mysql 的存储引擎介绍
    查看>>
    MySQL 的存储引擎有哪些?为什么常用InnoDB?
    查看>>
    Mysql 知识回顾总结-索引
    查看>>
    Mysql 笔记
    查看>>
    MySQL 精选 60 道面试题(含答案)
    查看>>
    mysql 索引
    查看>>
    MySQL 索引失效的 15 种场景!
    查看>>