访问超类构造函数中的局部变量

时间:2015-03-18 19:42:43

标签: java inheritance constructor constructor-chaining

我有一个具有此构造函数的超类:

public Super(String p){
    String[] result = p.split(",");
    setA(result[0]);
    setB(result[1]);
    setC(result[2]);
    setD(result[3]);
    setE(result[4]);
}

然后我有一个子类,我想使用相同的构造函数,但添加2个字符串。这是我的代码:

public Sub(String d){
    super(d);
    setF(result[5]);
    setG(result[6]);
}

使用此代码我收到一条未指定结果的错误。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

基本上你需要在子类构造函数中再次进行拆分 - 局部变量result在子类构造函数中不可用:

public Sub(String d){
    super(d);
    String[] result = d.split(",");
    setF(result[5]);
    setG(result[6]);
}

是的,它最终会重复工作,但这有点难以避免。你可以通过一个私有子类构造函数来获取String[],并使用工厂方法来进行拆分:

protected Super(String[] result) {
    setA(result[0]);
    setB(result[1]);
    setC(result[2]);
    setD(result[3]);
    setE(result[4]);
}

protected Super(String d) {
    this(d.split(","));
}

...
private Sub(String[] result) {
    super(result);
    setF(result[5]);
    setG(result[6]); 
}

public static Sub fromString(String d) {
    return new Sub(d.split(","));
}

有一个替代选项,其中超类构造函数调用在子类中重写的虚方法,但是真的脆弱且非常可怕,我甚至不打算提供示例。< / p>