Вызов метода Java в цепочке конструктора - PullRequest
1 голос
/ 29 февраля 2012

Можно ли вызвать конструктор с результатом метода из другого конструктора того же класса?

Я хочу принимать входные данные в нескольких формах и иметь что-то вроде:

public class MyClass
{
    public MyClass(int intInput)
    {
    ...
    }

    public MyClass(String stringInput);
    {
        this(convertToInt(stringInput));
    }

    public int convertToInt(String aString)
    {
        return anInt;
    }
}

Когда я пытаюсь скомпилировать это, я получаю

error: cannot reference this before supertype constructor has been called

ссылаясь на convertToInt.

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

Вам просто нужно сделать convertToInt статичным.Так как он на самом деле не полагается ни на что в экземпляре класса, он, вероятно, в любом случае не относится к этому классу.

Вот пример:

class MyClass {
    public MyClass(String string) {
        this(ComplicatedTypeConverter.fromString(string));
    }

    public MyClass(ComplicatedType myType) {
        this.myType = myType;
    }
}

class ComplicatedTypeConverter {
    public static ComplicatedType fromString(String string) {
        return something;
    }
}

Вы должны сделатьэто так, потому что за кулисами супер-конструктор (в данном случае Object) должен быть вызван до запуска вашего собственного конструктора.Обращаясь к this (через вызов метода) до того, как произойдет этот невидимый вызов super();, вы нарушаете языковое ограничение.

См. JLS , раздел 8.8.7 и больше JLS раздел 12.5.

2 голосов
/ 29 февраля 2012

Метод convertToInt не может быть вызван, потому что он должен запускаться объектом, а не только из класса.Следовательно, изменение кода на

public static int convertToInt(String aString)
{
    return anInt;
}

означает, что convertToInt до завершения конструктора.

0 голосов
/ 29 февраля 2012

Нет, это невозможно.Для вызова метода экземпляра должен быть вызван весь ваш конструктор суперкласса.В этом случае вы вызываете this (), который заменяет вызов super ().Вы не можете одновременно использовать super () и this () в одной и той же функции.Таким образом, экземпляр суперкласса не инициализируется в вашем случае, следовательно, вы получаете эту ошибку.

Вы можете позвонить вот так

public MyClass(String stringInput) {
    super(); // No need to even call... added just for clarification
    int i = convertToInt(stringInput);
}

Создание статического метода может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...