初始化后,在构造函数或设置对象属性中设置对象的所有属性

时间:2013-10-28 14:04:24

标签: oop

我想知道在构造之后设置对象的属性是否有优势,而不是在构造函数中。

我正在使用具有创建成本昂贵的属性的对象,因此在我看来,我应该在创建对象后设置属性。但是,当我使用这些对象时,我不得不质疑该属性是否已被设置,我宁愿假设它被设置。

特别适用于我的问题:假设我们有一个带有friendslist属性的User对象(用户数组)。如果必须设置friendslist属性,那么每个'朋友'用户都必须使用自己的好友列表进行初始化..这会永远持续下去吗?但是,似乎好友列表适合作为用户的属性 - 所以我们将好友列表与用户分开或者稍后设置好友列表?

非常感谢对此事的任何见解,谢谢。

2 个答案:

答案 0 :(得分:0)

理想情况下,对象不应具有无效状态,因此应优先将对象直接构建为已配置状态。

但是,您将遇到您使用的语言的细节。例如,在C ++中,有两种力量可以推动你:

  • exceptions from constructors的问题。 Function-try blocks帮助,但他们往往是在深奥的一面,很多开发人员都没有意识到这些。
  • 类的许多复杂签名构造函数的增加,使得难以评估哪一个是正确的。

其他语言可以做一些掩盖问题的语法糖。例如。 C#具有像new A() {foo="x", bar="y";}这样的object initializer构造,这使得在中间未初始化状态下使用对象变得困难(并非不可能!)。

答案 1 :(得分:0)

我通常选择在构造函数中初始化对象的所有属性。这是我的理由:

您不能在伪代码中意外设置对象的某些属性,现在另一个属性:

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%   时间:过早优化是万恶之源“

对于您的具体问题,我会将朋友列表与用户分开,因为它会使用户对象更容易推理(您不必担心它的设置状态,或者属性是否定义良好,您只需知道用户是用户...)您可以拥有一个单独的数据结构和函数,它接受一个User对象并返回其相应的friendslist。