我一般选择在构造函数中初始化对象的所有属性。这是我的推理:
您不能在伪代码中意外设置对象的某些属性,而现在又设置另一个属性:
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)
对比
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
此外,如果对象是不可变的(在构造它之后您不能修改它),您的代码将更容易维护,因为您不必总是担心对象的状态。请参阅可变对象与不可变对象
但是,如果在分析您的代码并且对象属性的早期初始化成为一个明显的瓶颈之后,您可以重构您的代码以稍后将其初始化为优化,我相信您已经听说过 Donald Knuth 的名言:
“我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源”
对于您的具体问题,我会将朋友列表与用户分开,因为它会使用户对象更容易推理(您不必担心它设置为什么状态,或者如果属性定义明确,您只需知道一个用户是用户...)你可以有一个单一的数据结构和函数,它接受一个用户对象并返回其对应的好友列表。