0

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

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

每次我想设置它的一个属性时,在 MainClass 中延迟实例化 SubClass 为我省去了检查 SubClass 是否存在(如果不存在则创建它)的麻烦。

另一方面,尽管只有 SubClass 存在时,我才无法在视图中设置变量。让我解释得更好。假设我只想在 SubClass.name 存在的情况下设置我的文本字段的 stringValue。每次我询问 SubClass.name 的存在时,MainClass 都会懒惰地实例化 SubClass,这是一种浪费。

最好的方法是什么?

4

1 回答 1

0

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

是的,延迟初始化有优点也有缺点。

好处

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

缺点

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

混合方法是可能的。对于重要任务,使用惰性实例化:

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

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

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

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

于 2013-03-13T22:01:00.677 回答