这是演示,
public class MyClass {
public MyClass(String str) {
if (null == str)
return;
mStr = processInput(str);
mMember1 = initMember1();
// ... some other initialization
}
如上所述,是好还是坏? 如果它返回,我们可能会得到一个没有正确初始化的构造对象。
答案 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
。然后你可以继续处理部分对象,你要做的就是抛出像SecurityException
或IllegalStateException
这样的东西。我通常倾向于SecurityException
,因为它表明恶意有可能采取该部分对象并做坏事。 final
的使用将有助于防止某人扩展部分对象并在您的系统中乱跑。