>我正在尝试在Seaside上实现Singleton模式。这是我的代码:
uniqueInstance
uniqueInstance ifNil: [ uniqueInstance := self createInstance].
^ uniqueInstance
createInstance
^ self basicNew
initialize
users:= OrderedCollection new.
在实例端,我有作为实例变量的用户。当我调用应用程序唯一实例初始化工作时。当我检查用户变量时,它说"身份集"而不是OrderedCollection。
谁能给我一个错误的解决方案?
基于(Pharo)关于单例的邮件列表讨论,我前段时间写了一些变化 https://www.peteruhnak.com/blog/2015/12/06/singleton-variations/。
但单身人士的要点是:
- (通常)阻止
MyThing class>>new
- 因为它是单例
- 创建实例时调用
super new
或self basicNew initialize
- 这是绕过被阻止的
new
;如果你的方言没有自动调用initialize
,那么使用后一种形式
- 这是绕过被阻止的
- (可选)添加
MyThing class>>reset
以nil
实例- 主要是为了方便(使用
<script: 'self reset'>
编译指示可以做得更好)
- 主要是为了方便(使用
所以在你的情况下,它可以是这样的:
Users class>>uniqueInstance
^ uniqueInstance ifNil: [ uniqueInstance := super new ]
Users class>>new
self error: 'Users is a singleton -- send uniqueInstance instead'
Users>>initialize
users:= OrderedCollection new
如果您在Pharo,请随意探索现有的实现
MessageBrowser browse: (#uniqueInstance implementors select: #isMetaSide).
MessageBrowser browse: (#default implementors select: #isMetaSide).
MessageBrowser browse: (#current implementors select: #isMetaSide).
您的#createInstance
方法发送#basicNew
消息,但此方法不会发送#initialize
。所以没有人初始化你的对象,users
仍然nil
。一定有一些懒惰的方法可以将users
设置为IndentitySet
,这就是您获得它的原因。但是没有人把它变成OrderedCollection
.
要initialize
实例,请使用#new
而不是#basicNew
;至少在Pharo和其他一些方言中,#new
会为你发送#initialize
。