Доступ к локальным переменным в конструкторе суперкласса

У меня есть супер класс, который имеет этот конструктор:

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 ответ

Решение

По сути, вам нужно будет снова выполнить разбиение в конструкторе подкласса - локальной переменной 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(","));
}

Есть альтернативный вариант, когда конструктор суперкласса вызывает виртуальный метод, который переопределен в подклассе, но он действительно хрупок и достаточно ужасен, что я даже не собираюсь приводить пример.

Другие вопросы по тегам