文档章节

Scala学习之类和属性篇(三):单例与私有构造函数

阿拉德大陆的魔法师
 阿拉德大陆的魔法师
发布于 2016/12/09 18:01
字数 445
阅读 77
收藏 0

我们知道,要想使用单例那么就必须定义私有构造函数来防止从类的外部来创建类的实例。在Scala中你也可以通过private关键字定义类的私有主构造函数来防止从类的外部创建类的实例。

scala> class Person private(name: String)
defined class Person
warning: previously defined object Person is not a companion to class Person.
Companions must be defined together; you may wish to use :paste mode for this.

scala> val p = new Person("Ming")
<console>:12: error: constructor Person in class Person cannot be accessed in object $iw
       val p = new Person("Ming")
               ^

我们看到在类的外部已经无法使用new关键字来实例化这个类了。那么在Scala中如何实现getInstance方法来获取这个对象的实例呢,就是在类的伴生对象中实现这个方法。

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person private(name: String)

object Person {
  def getInstance(name: String) = new Person(name)
}

// Exiting paste mode, now interpreting.

defined class Person
defined object Person

scala> val p = Person.getInstance("Ming")
p: Person = Person@7859bd9a

你可能发现了,这个时候Person并不是一个单例对象,而只是限制了主构造函数的访问权限。其实在Scala中实现一个单例对象最简单的方式就是直接使用类的伴生对象,而不需要定义类。当然你也可以像Java中那样去实现一个单例对象。你会看到不管你调用多少次getInstance方法,得到的都是同一个对象。

scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person private(name: String)

object Person {
  private var p:Option[Person] = None
  def getInstance(name: String): Person = {
    if (!p.isDefined) {
      p = Some(new Person(name))
    } 
    p.get
  }
}

// Exiting paste mode, now interpreting.

defined class Person
defined object Person

scala> val p = Person.getInstance("Ming")
p: Person = Person@47d32e33

scala> val p = Person.getInstance("Li")
p: Person = Person@47d32e33

 

© 著作权归作者所有

阿拉德大陆的魔法师
粉丝 27
博文 91
码字总数 83019
作品 0
西城
程序员
私信 提问
Scala学习目录

字符串篇 1.1 字符串的比较 1.2 使用多行字符串 1.3 字符串的切分 1.4 插值函数 1.5 逐字符处理字符串 1.6 使用正则表达式 1.7 访问字符串特定位置的字符 1.8 使用隐式方法来扩展字符串类 2....

阿拉德大陆的魔法师
2016/04/20
367
0
scala学习(三)

scala类: scala中类定义里,可以放置字段和方法,这些被统称为成员(memeber) 所有成员默认是共有的,如java中默认带public一样 scala中不能定义静态成员,但是可以定义单例对象,用法java的...

如风达
2015/09/07
80
0
浅析Scala单例对象与伴生类

Scala的单例对象 Scala不能定义静态成员,而是代之定义单例对象(singleton object)。以object关键字定义。 对象定义了某个类的单个实例,包含了你想要的特性: 当你在应用程序中需要一个新的...

qq_39521554
2018/05/24
0
0
剑指Offer学习总结-实现Singleton模式

剑指Offer学习总结-实现Singleton模式 本系列为剑指Offer学习总结,主要是代码案例的分析和实现: 书籍链接:http://product.dangdang.com/24242724.html 原作者博客:http://zhedahht.blog....

wwlcsdn000
2018/01/15
0
0
Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性

Tips 《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8...

M104
2017/12/23
0
1

没有更多内容

加载失败,请刷新页面

加载更多

CSS--列表

一、列表标识项 list-style-type none:去掉标识项 disc:默认实心圆 circle:空心圆 squire:矩形 二、列表项图片 list-style-img: 取值:url(路径) 三、列表项位置 list-style-position:...

wytao1995
今天
4
0
linux 命令-文本比较comm、diff、patch

本文原创首发于公众号:编程三分钟 今天学了三个文本比较的命令分享给大家。 comm comm 命令比较相同的文本 $ cat charabc$ cat chardiffadc 比如,我有两个文件char和chardiff如上,...

编程三分钟
今天
7
0
QML教程

https://blog.csdn.net/qq_40194498/article/category/7580030 https://blog.csdn.net/LaineGates/article/details/50887765...

shzwork
今天
5
0
HA Cluster之5

对于使用heartbeat v2版的CRM配置的集群信息都是保存在一个名为cib.xml的配置文件中,存放在/var/lib/heartbeat/crm/下。CIB:Cluster Information Base,由于xml文件配置不是那么方便,所以...

lhdzw
今天
6
0
玩转Redis-Redis基础数据结构及核心命令

  《玩转Redis》系列文章主要讲述Redis的基础及中高级应用,文章基于Redis5.0.4+。本文主要讲述Redis的数据结构String,《玩转Redis-Redis基础数据结构及核心命令》相关操作命令为方便对比...

zxiaofan666
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部