可可懒惰的实例化 - 最佳实践

时间:2012-07-16 21:37:22

标签: cocoa lazy-initialization

我对懒惰实例化的最佳编码实践有疑问。

我有一个自定义类(MainClass),它构成了我的视图控制器的模型。 MainClass的一个属性是另一个自定义类(SubClass)。 现在让我们说我想从我的视图控制器访问并设置SubClass的一些属性。 我应该在MainClass中实例化SubClass吗?

在MainClass中实例化SubClass,在每次我想设置其中一个属性时,都可以省去检查SubClass是否存在(以及在它不存在时创建它)的麻烦。

另一方面,虽然只有SubClass存在时我才能在视图中设置变量。让我解释一下。假设我只想在SubClass.name存在的情况下设置textfield的stringValue。每次我要求存在SubClass.name时,MainClass都会懒惰地实例化SubClass,这是一种浪费。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

你需要对美学做出决定,如果这是推动这个问题的原因,或者你需要解释性能限制。

是的,懒惰初始化有优点和缺点。

优点

  • 您不支付您从未使用过的物品
  • 您不需要在您不会使用的对象上实际设置字段
  • 如果需要,可以在最后一刻构建对象,这通常比在启动时构建它更好

劣势

  • (轻微)复杂性 - 特别是如果你或同事不习惯这个成语
  • 如果您忘记在访问者中调用Initialize()或等效文件,您可能会在某些语言中遇到棘手的错误,或者在其他语言中崩溃

混合方法是可行的。对于重要任务,请使用延迟实例化:

 - (void) display {
     [self initialize];
     [self display];
     }

对于不重要的任务,只需检查初始化。

 - (void) updateCaches {
     if ([self isInitialized]) {
         [self reloadCachedDataFrom: [self startDatabaseSession]];
     }
 }

您不希望构建对象只是为了更新其缓存,但是,如果对象是实时的,您可能希望继续保持缓存温暖。所以,你看看你是否已经实例化了这个对象,并且只有在已经设置了缓存的情况下才重新加载缓存。