博客
关于我
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的root用户无法建库的问题
    查看>>
    mysql的sql_mode参数
    查看>>
    MySQL的sql_mode模式说明及设置
    查看>>
    mysql的sql执行计划详解
    查看>>
    mysql的sql语句基本练习
    查看>>
    Mysql的timestamp(时间戳)详解以及2038问题的解决方案
    查看>>
    mysql的util类怎么写_自己写的mysql类
    查看>>
    MySQL的xml中对大于,小于,等于的处理转换
    查看>>
    mysql的下载安装
    查看>>
    Mysql的两种存储引擎详细分析及区别(全)
    查看>>
    mysql的临时表简介
    查看>>
    MySQL的主从复制云栖社区_mysql 主从复制配置
    查看>>
    MySQL的事务隔离级别实战
    查看>>
    mysql的优化策略有哪些
    查看>>
    MySQL的使用
    查看>>
    mysql的全文检索的方法
    查看>>
    MySQL的函数
    查看>>
    mysql的函数DATE_ADD()
    查看>>
    mysql的函数操作
    查看>>
    mysql的分类排名_mysql高低排名
    查看>>