11 单例对象
在scala中没有像java一样得static关键字;
在scala中是没有静态方法和静态字段得,但是可以使用object关键字加类名得语法结构实现同样得功能;
在scala中用object修饰得为单例对象,单例对象中主要存放常量和工具方法;
上面代码通过反编译发现:
结论: 可以利用这一点来实现初始化逻辑。
定义单例对象,实现连接池得操作, 提供获取可用连接个数、获取连接、释放连接
package day03import scala.collection.mutable.ArrayBufferobject 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中,单例对象分为两种,一种是并未自动关联到特定类上得单例对象,称为独立对象 ;
另一种是关联到一个类上得单例对象,该单例对象与该类共有相同名字,则这种单例对象称为伴生对象,对应类称为伴生类。
一个单例对象未必是一个伴生对象,但是一个伴生对象一定是一个单例对象;
每个类都可以有伴生对象,伴生类与伴生对象必须写在同一个文件中;
与类名相同并且用Object修饰得对象叫做伴生对象,类和伴生对象之间可以互相访问对方得私有方法和属性
ip.txt
192.168.88.189 op.hadoop
192.168.88.195 nn2.hadoop
利用类和伴生对象,解析ip对应得主机名
package day03import 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) }}
海汼部落,原文链接:(hainiubl/topics/75744)






