解决方法
您还可以使用“Lazy initailizer”模式,其中集合未初始化,直到(并且除非)有人访问属性getter …这避免了在父对象被实例化为其他某些情况下创建它的开销目的不需要收集…
public class Division { private int divId; public int DivisionId { get; set; } private Collection<Employee> emps; public Collection<Employee> Employees { get {return emps?? (emps = new Collection<Employee>(DivisionId));}} }
编辑:这种实现模式通常不是线程安全的…在第一个线程完成修改之前,emps可以被两个不同的线程读取为空.在这种情况下,可能没有关系,因为DivisionId是不可变的,虽然两个线程都会获得不同的集合,但它们都是有效的.因此,第二个线索将会是一个有效的收集. “可能”是因为第一个线程可能在第二个线程重置它之前开始使用emps.这不是线程安全的. Jon SKeet的另一个稍微更复杂的一个实现是线程安全的(参见This article on SIngletons他的例子/讨论如何解决这个问题.