1

这是演示,

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

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

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

4

5 回答 5

3

这取决于。

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

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


看起来这个构造函数是一个方便的构造函数,相当于:

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

如果是这样,更好的方法可能是使用流利的接口模式,其中方法返回this(在可能的情况下),因此您可以编写代码:

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

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

于 2012-12-17T05:32:14.547 回答
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,从构造函数返回是一种不好的做法。:)

于 2012-12-17T05:43:23.823 回答
1

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

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

推迟引发异常只会从实际故障点中移除故障点识别,从而更难定位根本原因。

于 2012-12-17T05:30:31.903 回答
1

当您从构造函数返回时,它仍然会创建对象,但不会在返回后初始化其余代码。如果你的班级可以正常行事,那就没关系。如果初始化其余部分至关重要,但您不能,则抛出异常让发件人知道出现问题。

于 2012-12-17T05:33:57.973 回答
0

您需要做的第一件事是标记该类final。然后你可以继续处理部分对象,你想做的是抛出类似 aSecurityException或 an 的东西IllegalStateException。我通常倾向于 ,SecurityException因为它表明有恶意的人可能会拿走该部分对象并做坏事。的使用final将有助于防止有人扩展部分对象并在您的系统中乱跑。

于 2012-12-17T17:36:17.860 回答