什么是惰性分配?
什么是延迟分配(Lazy Allocation)?延迟分配指的是直到实际需要时才分配资源。这在单例对象中很常见,严格来说,只要资源尽可能地延迟分配,就可以看作是延迟分配的例子。
通过延迟分配资源直到实际需要时,可以减少启动时间,甚至在实际上不使用该对象时完全避免分配。相比之下,如果事先分配一个预计将来需要的资源,虽然可以使后续执行更高效,但会增加启动时间,并且避免了在程序执行的后期可能出现的分配失败的情况。
下面的代码提供了一个延迟分配的单例对象的示例:
public class Widget { private Widget singleton; public static Widget get() { if (singleton == null) { singleton = new Widget(); } return singleton; } private Widget() { // ... } // ... }
请注意,此代码不是线程安全的。在大多数情况下,对`get()`方法的访问应该以某种方式进行同步。
类似的(或者更一般性的)概念是延迟初始化(lazy initialization)。
“late objects”和“lazy init”这两个术语是否是同义词?就像本文标题中的Java How to Program: Late Objects Version一样?我在谷歌上搜索了一下,但除了这本书以外找不到其他参考资料。
根据搜索结果来看,Deitel出版社有两个版本的这本书,一个是使用“late objects”(延迟对象)的版本,其中最初的章节以过程式风格编写(后来再引入类/对象),另一个是使用“early objects”(早期对象)的版本,其中立即引入类/对象。他们使用“late objects”和“early objects”来区分这两种教学风格,与延迟初始化没有任何关系。