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