如果一个类有一个构造函数,它将一些值对象作为参数并依赖于它来进行初始化。如果此对象为null,它应该如何反应?
class SomeClass
{
private SomeData _data;
public SomeClass(SomeValueObject obj)
{
_data = obj.Data;
}
}
这是一个例子,但总的来说:如果构造函数被赋予无效参数,那么它应该怎么行动呢?因此不能正确地进行构造?它应该只是返回而不进行任何初始化?将参数设置为某些默认值?抛出异常?别的什么?
我确信这个问题的答案是“它取决于”,但有没有最佳做法等?
答案 0 :(得分:15)
程序员应该能够假设成功创建了一个对象,除非引发异常。异常的类型取决于参数,但仍应取消选中。你想要的最后一件事是构造函数无法构建一个有效的对象,也没有告诉调用者它。
我认为在构造函数中使用默认值是一种危险的习惯。
答案 1 :(得分:6)
很大程度上取决于您的业务逻辑。如果您的业务逻辑要求SomeValueObject
不为空,意味着SomeClass
无法在没有SomeValueObject
的情况下实例化,那么构造函数肯定会抛出异常,可能是IllegalArgumentException
。
答案 2 :(得分:3)
这似乎是Java,但在C ++中它应该最终抛出(偶然std::invalid_argument
。)
我想对于Java来说它完全一样。
在极少数情况下,抛出异常会产生过大的开销,您应该返回,并在对象中设置一个没有正确构造的标志。然后检查isValid()
成员函数。
答案 3 :(得分:2)
抛出一个空参数异常。
答案 4 :(得分:1)
如果字段很重要,它应该抛出异常以指示不应该使用该对象。如果它不重要,您可以指定默认值。
答案 5 :(得分:1)
如果某个对象的默认值无效,则应初始化为默认值并等待初始化。例如,foo.set_values(...)
。在这种情况下,应该有is_ready()
或is_valid()
的查询,以便在使用前进行检查。
如果某个对象绝对不能处于无效的数据状态,那么它应该抛出异常。
这两种情况都是我所说的。