gpt4 book ai didi

ruby - 常量与按需实例化的对象——哪个最优?

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:55 24 4
gpt4 key购买 nike

采取下面的方法(用Ruby写的,但是这道题可以适用于大多数OO语言)

# Getter method which returns an alert
def alertView
_alertView = AlertView.new
_alertView.title = "This is the title"
_alertView.body = "This is the body of my alert"
_alertView
end

假设在应用程序的整个生命周期中定期调用此方法。每次都会将 title 和 body 属性字符串实例化为新对象。

要对此进行优化,我们可以执行以下操作:

ALERT_TITLE = "This is the title"
ALERT_BODY = "This is the body of my alert"

# Getter method which returns an alert
def alertView
_alertView = AlertView.new
_alertView.title = ALERT_TITLE
_alertView.body = ALERT_BODY
_alertView
end

这样,ALERT_TITLEALERT_BODY 字符串仅在定义类时实例化一次,然后在整个应用程序的生命周期中重复使用。

我的问题是:第二种方法是否最优?虽然这意味着垃圾收集器的工作更少,内存使用可能更稳定,但这也意味着应用程序一直在占用更多内存,而不是释放当前不需要的对象。在将此方法应用于我的应用程序中的所有常量字符串或根本不应用此方法并在需要时定义每个字符串之间,我左右为难。

第三种方法是使用类变量,但与第二种方法相比,这种方法的唯一优势是变量是延迟加载的。

# Getter method which returns an alert
def alertView
_alertView = AlertView.new
_alertView.title = @@alert_title ||= "This is the title"
_alertView.body = @@alert_body ||= "This is the body of my alert"
_alertView
end

最佳答案

上面的两个变体并不完全相同。观察:

1.9.3p194 :001 > A = 'a'
=> "a"
1.9.3p194 :002 > s1 = A # constant assignment
=> "a"
1.9.3p194 :003 > s2 = A
=> "a"
1.9.3p194 :004 > s1 << 'b'
=> "ab"
1.9.3p194 :005 > s2 # you changed s2 as well!
=> "ab"
1.9.3p194 :006 > s1 = 'a' # literal assignment
=> "a"
1.9.3p194 :007 > s2 = 'a'
=> "a"
1.9.3p194 :008 > s1 << 'b'
=> "ab"
1.9.3p194 :009 > s2 # s2 stayed the same.
=> "a"

当两个变量被赋予同一个常量时,内存中仍然只有一个字符串实例。当您分配文字字符串时,每个变量在内存中都有自己的实例(这不适用于您在另一条评论中正确指出的符号)。因此,一切都取决于您想要实现(或避免)的目标、您创建的实例数量等。

如果问题真的是关于字符串的,就像在您的示例中一样,我会说您不再关心效率并开始关心代码的可读性,因为所有这些都是可用内存的极小部分现在你的程序。

因此,从程序员的角度来看,我建议您做任何您认为更干净的事情。

关于ruby - 常量与按需实例化的对象——哪个最优?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com