Seaside Smalltalk上的独特实例



>我正在尝试在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/。

但单身人士的要点是:

  1. (通常)阻止MyThing class>>new
    • 因为它是单例
  2. 创建实例时调用super newself basicNew initialize
    • 这是绕过被阻止的new;如果你的方言没有自动调用initialize,那么使用后一种形式
  3. (可选)添加MyThing class>>resetnil实例
    • 主要是为了方便(使用<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

最新更新