簡體   English   中英

海邊Smalltalk上的uniqueInstance

[英]uniqueInstance on Seaside Smalltalk

我正在嘗試在Seaside上實現Singleton模式。 這是我的代碼:

        uniqueInstance
            uniqueInstance ifNil: [ uniqueInstance := self createInstance].
            ^ uniqueInstance

    createInstance
        ^ self basicNew

initialize
    users:= OrderedCollection new.

在實例方面,我有作為實例變量的用戶 當我調用應用程序時,uniqueInstance初始化工作。 當我檢查用戶變量時,它說的是“ Identity Set”,而不是OrderedCollection。

有人可以給我解決我的錯誤的方法嗎?

您的#createInstance方法發送#basicNew消息,但此消息不發送#initialize 因此,沒有人初始化您的對象,而users仍然nil 必須有一些將users設置為IndentitySet惰性方法,這就是為什么IndentitySet 但是沒有人將其OrderedCollection

initialize實例,請使用#new而不是#basicNew 至少在Pharo和其他一些方言中, #new會為您發送#initialize

基於(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).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM