如果这是一个很好的做法,如果一些错误的初始化,从构造函数返回?

时间:2012-12-17 05:28:48

标签: java exception-handling constructor

这是演示,

public class MyClass {
    public MyClass(String str) {
        if (null == str)
            return;

        mStr = processInput(str);
        mMember1 = initMember1();
        // ... some other initialization
}

如上所述,是好还是坏? 如果它返回,我们可能会得到一个没有正确初始化的构造对象。

5 个答案:

答案 0 :(得分:3)

取决于。

如果你的类可以正常运行并将null传递给构造函数并绕过初始化,那么就可以了。

如果您的类不能,则抛出异常,如果不是已检查的异常,则通常IllegalArgumentException


看起来这个构造函数是一个等同于:

的便利构造函数
MyClass o = new MyClass();
o.doSomethingWithString(str);

如果是这样,更好的方法可能是使用fluent interface模式,其中方法返回this(如果可能),因此您可以编码:

MyClass o = new MyClass().doSomethingWithString(str);

此处,方法doSomethingWithString()而不是声明为void,返回类型为MyClass,最后一行为return this;。这种模式对于链接方法调用很方便,即o.doX().setY(y).doZ();

答案 1 :(得分:2)

这可能会更好。

public class MyClass {
    public MyClass(String str) {
        if (null == str){
            throw new YourException("Your message");
        }
        mStr = processInput(str);
        mMember1 = initMember1();
        // ... some other initialization
}

IMO,从构造函数返回是一种不好的做法。 :)

答案 2 :(得分:1)

如果构造函数无法将对象置于有用状态,则最可能的防弹合同是构造函数抛出异常。

假设调用者将检查任何内部错误标志是危险的。

推迟提出异常只会从实际故障点中删除故障点识别,从而更难找到根本原因。

答案 3 :(得分:1)

从构造函数返回时,它仍会创建对象,但在返回后不会初始化其余代码。如果你的班级表现得很好,那就没关系。如果初始化其余部分是至关重要的,但是你不能这样做,为发送者抛出一个例外,让他知道出现了问题。

答案 4 :(得分:0)

您需要做的第一件事是标记该类final。然后你可以继续处理部分对象,你要做的就是抛出像SecurityExceptionIllegalStateException这样的东西。我通常倾向于SecurityException,因为它表明恶意有可能采取该部分对象并做坏事。 final的使用将有助于防止某人扩展部分对象并在您的系统中乱跑。