Вызов метода Java в цепочке конструктора

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

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

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

Решение

Вам просто нужно сделать 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(); бывает, что ты нарушаешь языковые ограничения.

См. Раздел 8.8.7 JLS и более из раздела 12.5 JLS.

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

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

Значит это convertToInt до того, как конструктор закончил.

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

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

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

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

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