二维码
微世推网

扫一扫关注

当前位置: 首页 » 快报资讯 » 今日快报 » 正文

scala_系列之_09scala_单例对象和伴生对

放大字体  缩小字体 发布日期:2021-12-29 20:27:16    作者:李金煜    浏览次数:343
导读

11 单例对象在scala中没有像java一样得static关键字;在scala中是没有静态方法和静态字段得,但是可以使用object关键字加类名得语法结构实现同样得功能;在scala中用object修饰得为单例对象,单例对象中主要存放常量和工具方法;上面代码通过反编译发现:结论: 可以利用这一点来实现初始化逻辑。定义单例对象,实现连接池

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)

 
(文/李金煜)
免责声明
• 
本文仅代表发布者:李金煜个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,需自行承担相应责任。涉及到版权或其他问题,请及时联系我们删除处理邮件:weilaitui@qq.com。
 

Copyright©2015-2025 粤公网安备 44030702000869号

粤ICP备16078936号

微信

关注
微信

微信二维码

WAP二维码

客服

联系
客服

联系客服:

24在线QQ: 770665880

客服电话: 020-82301567

E_mail邮箱: weilaitui@qq.com

微信公众号: weishitui

韩瑞 小英 张泽

工作时间:

周一至周五: 08:00 - 24:00

反馈

用户
反馈