我通常选择在构造函数中初始化对象的所有属性。这里是我的推理:
你可以不小心设置一些对象的属性和现在其他的,在伪代码:
obj = new Obj(prop_a, prop_b, prop_c) // Error if not all three properties are set
method_requiring_all_three_values_are_initialized(obj)
VS
obj = new Obj() //No error, becuase constructor doesn't take the arguments
obj.set_prop_a(val);
obj.set_prop_b(val_2);
method_requiring_all_three_values_are_initialized(obj) // Runtime error
而且,如果对象是不可变的(在构建它之后你不能修改它),所以你的代码会更容易维护,因为你不必担心对象的状态。见Mutable vs immutable objects
但是,如果你的剖析代码和对象属性的早期初始化后变成透明的瓶颈,你可以重构后面的代码初始化为优化,我敢肯定,你听说过高德纳报价:
“我们应该忘记小的效率,讲的 时间约97%:过早的优化是所有罪恶的根源”
为了您的具体问题,我会小号从用户分离的朋友列表,因为它会使用户对象更容易推理(你不必担心它设置了什么状态,或者如果属性定义得很好,你只知道用户是用户... )您可以拥有一个数据结构和函数,它接受一个用户对象并返回其相应的好友列表。
比方说,我们有一个用户对象与一个friendslist属性(用户数组)。如果必须设置好friendslist属性,那么每个“朋友”用户都必须使用自己的好友列表进行初始化......并且这将永远持续下去?但是,好像朋友列表适合作为用户的属性 - 那么我们是否将用户列表与用户分开,或者可以随后设置好朋友列表? - 将这添加到我的q。 – Titus
苹果和橘子。 [延迟加载](http://en.wikipedia.org/wiki/Lazy_loading)与Eager加载是一个非常**不同的问题。阅读[代理模式](http://en.wikipedia.org/wiki/Proxy_pattern)。 –
延迟加载的概念很有趣,但肯定会延迟加载导致对象设置自己的属性? – Titus