scala 系列之 09scala 单例对象和伴生对象

教程 潘牛 ⋅ 于 2021-07-08 22:49:26 ⋅ 1369 阅读

11 单例对象

在scala中没有像java一样的static关键字;

在scala中是没有静态方法和静态字段的,但是可以使用object关键字加类名的语法结构实现同样的功能;

在scala中用object修饰的为单例对象,单例对象中主要存放常量和工具方法;

file

上面代码通过反编译发现:

file

结论: 可以利用这一点来实现初始化逻辑。

定义单例对象,实现连接池的操作, 提供获取可用连接个数、获取连接、释放连接

package day03
import scala.collection.mutable.ArrayBuffer
object ConnFactory {
  // 利用初始化代码来初始化连接池里面的连接
  // 连接池最大连接3个
  private val maxNum:Int = 3
  //
  private val conns = new ArrayBuffer[Conn]
  for(i <- 1 to 3){
    conns += new Conn(i)
  }
  // 获取可用连接个数
  def getConnSize = this.conns.size
  //获取连接
  def getConn:Conn = {
    if(this.conns.size == 0){
      null
    }else{
      val conn = this.conns.remove(0)
      conn
    }
  }
  // 释放连接
  def releaseConn(conn:Conn):Boolean = {
    if(conn == null || this.conns.size == this.maxNum){
      false
    }else{
      this.conns += conn
      true
    }
  }
}
object ConnFactoryTest{
  def main(args: Array[String]): Unit = {
    println(ConnFactory.getConnSize)
    val conn1 = ConnFactory.getConn
    val conn2 = ConnFactory.getConn
    val conn3 = ConnFactory.getConn
    val conn4 = ConnFactory.getConn
    println(s"${conn1}, ${conn2}, ${conn3}, ${conn4}")
    val res4 = ConnFactory.releaseConn(conn4)
    val res3 = ConnFactory.releaseConn(conn3)
    val res2 = ConnFactory.releaseConn(conn2)
    val res1 = ConnFactory.releaseConn(conn1)
    val res0 = ConnFactory.releaseConn(conn1)
    println(s"${res4}, ${res3}, ${res2}, ${res1}, ${res0}")
  }
}
// 连接对象
class Conn(val id:Int){
  override def toString: String = s"Conn[${id}]"
}

12 伴生对象

在Scala中,单例对象分为两种,一种是并未自动关联到特定类上的单例对象,称为独立对象 ;

另一种是关联到一个类上的单例对象,该单例对象与该类共有相同名字,则这种单例对象称为伴生对象,对应类称为伴生类。

一个单例对象未必是一个伴生对象,但是一个伴生对象一定是一个单例对象;

每个类都可以有伴生对象,伴生类与伴生对象必须写在同一个文件中;

file

与类名相同并且用Object修饰的对象叫做伴生对象,类和伴生对象之间可以互相访问对方的私有方法和属性

ip.txt

192.168.88.189 op.hadoop

192.168.88.195 nn2.hadoop

利用类和伴生对象,解析ip对应的主机名

package day03
import scala.io.Source
// 伴生类
class Parser(val ip:String) {
  def parse = {
    // 调用伴生对象的map获取对应ip的主机名
    Parser.map.getOrElse(ip, "无该主机")
  }
}
// 伴生对象
object Parser{
  // 读取文件并转成map
  private val list = Source.fromFile("/tmp/scala/ip.txt").getLines().toList
  private val list2 = list.map(_.split(" "))
  private val list3 = list2.map(f => (f(0), f(1)))
  private val map = list3.toMap
  println(map)
}
object ParserTest{
  def main(args: Array[String]): Unit = {
    val parser = new Parser("192.168.88.180")
    println(parser.parse)
  }
}
版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-潘牛,http://hainiubl.com/topics/75744
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter