计划使用工厂方法来获取ruby类的单例实例,但是我不确定它是否可以用于Ruby垃圾收集。
EG如果我有类似的话:
class Foo
def self.getInstance
@@instance = Foo.new if @instance.nil?
return @@instance
end
def counter
@counter
end
def increment
@counter++
end
private
def initialize
@counter = 0
end
end
因此,我熟悉的其他语言的工作方式是@instance无限期地存在垃圾收集,因此你可以依赖Foo.getInstance.increment在程序的生命周期内有一个连续递增的计数器。 / p>
但是,我不确定对类的实例变量@@ instance的引用是什么,所以它会被垃圾收集吗?
答案 0 :(得分:2)
@@instance
是一个类var,而不是一个实例var。该类包含对其类变量的引用,这可防止它们的垃圾收集,直到类本身未定义为止。
请不要滚动自己的单身人士模式。 stdlib有一个模块Singleton,您可以将它混合到您的类中以使其成为单例。 stdlib mixin会查找您忘记的详细信息,例如初始化的线程安全性和取消定义new
。
答案 1 :(得分:0)
使实例方法'foo'和与方法'@foo'同名的实例变量使用单例运算符||=
分配或获取Foo
的实例,如果您这样做这是从类方法中产生的内存泄漏
def foo
@foo ||= Foo.new
end
答案 2 :(得分:-2)
Singleton类是对象方法在特定于该对象时所处的位置,并且每个对象可以保存或保存这样的类。
1.9.3p374 :315 > Jd = class<<self;self;end
=> #<Class:#<Object:0x007ff304078d08>>
1.9.3p374 :316 > jd = Jd.new
TypeError: can't create instance of singleton class
from (irb):316:in `new'
from (irb):316
from /Users/rfatahi/.rvm/rubies/ruby-1.9.3-p374/bin/irb:16:in `<main>'
1.9.3p374 :317 > Jd.class
=> Class
向Singleton类添加方法:
1.9.3p374 :318 > class MyClass
1.9.3p374 :319?> end
=> nil
1.9.3p374 :320 > a = MyClass.new
=> #<MyClass:0x007ff30605b530>
1.9.3p374 :321 > def a.method1
1.9.3p374 :322?> end
=> nil