2012-02-29 3 views
1

Можно ли вызвать конструктор с результатом метода из другого конструктора того же класса?Вызов метода 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.

+0

Я бы не рекомендовал вызывать метод внутри конструктора; объектное строительство должно быть быстрым и простым. Возможно, это метод 'init()'? – mre

ответ

4

Вам просто нужно сделать 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; 
    } 
} 

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

См. the JLS раздел 8.8.7 и more of the JLS раздел 12.5.

+0

Спасибо! Я понял, что так же, как я задавал вопрос, поэтому я думал, что продолжу все равно и сам ответю. Я не просто скопировал ваш ответ, честный! – DenverCoder8

+0

Хе-хе - не проблема. :) – alpian

+0

Это упрощенная версия моего кода, там нет функции библиотеки для преобразования, которое мне нужно сделать. – DenverCoder8

2

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

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

означает, что convertToInt перед конструктором закончил.

0

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

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

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

Заставить статический метод может решить вашу проблему.

+0

Совершенно нормально вызвать другой конструктор из конструктора. См. [Как вызвать один конструктор из другого в Java?] (Http://stackoverflow.com/questions/285177/how-do-i-call-one-constructor-from-another-in-java) –

+0

Я никогда сказал, что вы не можете вызвать другого конструктора. Это прекрасно. Я сказал, что вы не можете называть это() и super() одновременно одним и тем же конструктором. – JProgrammer

+0

Это довольно запутанно. Я не думаю, что он задал такой вопрос. –

Смежные вопросы