给定无效参数时,构造函数应如何操作?

时间:2010-01-29 22:04:49

标签: constructor

如果一个类有一个构造函数,它将一些值对象作为参数并依赖于它来进行初始化。如果此对象为null,它应该如何反应?

class SomeClass
{
    private SomeData _data; 
    public SomeClass(SomeValueObject obj)
    {
        _data = obj.Data;
    }
}

这是一个例子,但总的来说:如果构造函数被赋予无效参数,那么它应该怎么行动呢?因此不能正确地进行构造?它应该只是返回而不进行任何初始化?将参数设置为某些默认值?抛出异常?别的什么?

我确信这个问题的答案是“它取决于”,但有没有最佳做法等?

6 个答案:

答案 0 :(得分:15)

程序员应该能够假设成功创建了一个对象,除非引发异常。异常的类型取决于参数,但仍应取消选中。你想要的最后一件事是构造函数无法构建一个有效的对象,也没有告诉调用者它。

我认为在构造函数中使用默认值是一种危险的习惯。

答案 1 :(得分:6)

很大程度上取决于您的业务逻辑。如果您的业务逻辑要求SomeValueObject不为空,意味着SomeClass无法在没有SomeValueObject的情况下实例化,那么构造函数肯定会抛出异常,可能是IllegalArgumentException

答案 2 :(得分:3)

这似乎是Java,但在C ++中它应该最终抛出(偶然std::invalid_argument。)

C++ FAQ Lite 17.2

我想对于Java来说它完全一样。

在极少数情况下,抛出异常会产生过大的开销,您应该返回,并在对象中设置一个没有正确构造的标志。然后检查isValid()成员函数。

答案 3 :(得分:2)

抛出一个空参数异常。

答案 4 :(得分:1)

如果字段很重要,它应该抛出异常以指示不应该使用该对象。如果它不重要,您可以指定默认值。

答案 5 :(得分:1)

如果某个对象的默认值无效,则应初始化为默认值并等待初始化。例如,foo.set_values(...)。在这种情况下,应该有is_ready()is_valid()的查询,以便在使用前进行检查。

如果某个对象绝对不能处于无效的数据状态,那么它应该抛出异常。

这两种情况都是我所说的。