2015-07-13 133 views
5

因此,我正在构建一个测试库,我将主要用于个人使用,但是我有一个问题。抛出异常然后调用构造函数?

对于Java,如果您的类中有2个或更多的构造函数,如果您希望从另一个构造函数中调用另一个构造函数,那么它必须是您首先要做的。这对我来说是有问题的,因为我有以下设置。

public Constructor(TypeA a, TypeB b, TypeC c) { 
    if (c.getData() == null) throw new IllegalArgumentException(""); 
    this(a, b, c.getOtherData()); 
} 

public Constructor(TypeA a, TypeB b, TypeD d) { 
    // stuff happens 
} 

我该怎么做,避免,“构造函数调用必须是构造函数中的第一个语句”错误?

+0

你不能做你想做的。 – bhspencer

+2

而不是构造函数考虑静态工厂方法。 – bhspencer

+0

我相信这不是一个很好的设计。 抛出IllegalArgumentException异常,表示构造函数使用不正确,这很好。但是,构造函数本身不应该处理它自己的异常。相反,调用此构造的代码应该处理它并调用其他构造函数。 – Sekkuar

回答

4

你不能做你想要的构造函数。相反,使用这样的静态因子方法:

public static TypeThing buildMyThing(TypeA a, TypeB b, TypeC c) { 
    if (c.getData() == null) throw new IllegalArgumentException(""); 
    return new TypeThing(a, b, c.getOtherData()); 
} 

public Constructor(TypeA a, TypeB b, TypeD d) { 
    // stuff happens 
} 
0

你可以有一个额外的私人construtor。我假设你在这里简化了代码太多了。你是在说如果有东西是空的,那就扔 - 别的你别的东西。

public Constructor(TypeA a, TypeB b, TypeC c) { 
    this(a, b, c.getData(), c.getOtherData()); //calls the private ctor 
} 

public Constructor(TypeA a, TypeB b, TypeD d) { 
    // stuff happens 
} 

private Constructor(TypeA a, TypeB b, TypeD d1, TypeD d2) { 
    // stuff happens 
} 

或者你可以在TypeC

private Constructor(TypeA a, TypeB b, TypeC) { 
    // now do you null check here. 
} 

只是通过Java并有时会引起一些阵痛!然后这个规则就是其中之一。在具体回答你关于编译错误的问题 - 你不能:(

3

一个选项(可能是坏的): 检查getData == null and throw the exception as first thing in c.getOtherData()`这将是正在执行的第一个方法

其他选项: 有一个方法类似,

helper() { 
    if (getData() == null) throw new Exception(); 
    return getOtherData(); 
} 

,并从你的构造函数,调用c.helper()代替c.getOtherData()

+0

对于第二个选项,您应该使助手最终避免“构造函数中的Overridable方法调用”问题。 – Drunix

0

尝试移动抛出的异常到第二个构造函数的开头。这将实现完全相同的事情。如果有多条路径指向该构造函数,则可以创建一个表示逻辑路径的附加参数。

+0

我不能这样做......一旦我调用'c.getOtherData()',我就失去了'c.getData()' – Spedwards

+0

在这种情况下,它看起来像只是使用getData()作为布尔标记在这个特定的情况下。您可能需要将布尔参数添加到最低构造函数,以标记getData是否为null。当调用它时,它看起来像这样: –

+0

构造函数(a,b,c.GetData()== null,c.GetOtherData()) –

2

如何创建静态工厂方法?

public static Constructor newInstance(TypeA a, TypeB b, TypeC c) { 
    if (c.getData() == null) throw new IllegalArgumentException(""); 
    return new Constructor(a, b, c); 
} 

private Constructor(TypeA a, TypeB b, TypeC c) { 
    this(a, b, c.getOtherData()); 
} 

private Constructor(TypeA a, TypeB b, TypeD d) { 
    // stuff happens 
} 
+0

那么,为什么你不会放弃第一个构造函数并让工厂方法返回第二个构造函数? – Spedwards

+0

@Spedwards我不确定你是如何使用第一个构造函数,所以我不想删除它,但如果你认为这是可行的,那么你当然可以做到这一点。 –

相关问题