Я пишу конструктор класса LoginRequest, который расширяет класс JsobObjectRequest (из фреймворка Volley в Android, но который совершенно не имеет отношения к вопросу)
С помощью этого кода:
public LoginRequest(String username, String password, Response.Listener<JSONObject> responseListener, Response.ErrorListener errorListener) {
Boolean hasCredentials=(username!=null && password!=null);
int method=hasCredentials? Method.POST:Request.Method.GET;
super(method, API_URL_LOGIN, null, responseListener, errorListener);
this.username=username;
this.password=password;
}
Я получаю ошибку: вызов super() должен быть первым выражением в body конструктора
Вместо этого этот код компилируется просто отлично:
public LoginRequest(String username, String password, Response.Listener<JSONObject> responseListener, Response.ErrorListener errorListener) {
super((username!=null && password!=null)? Method.POST:Request.Method.GET, API_URL_LOGIN, null, responseListener, errorListener);
this.username=username;
this.password=password;
}
Но разве это не то же самое? В обоих случаях выполняется несколько тривиальных вычислений до вызова суперструктора на основе значений параметров, переданных конструктору подкласса. Почему компилятор не должен компилировать первый пример, учитывая, что он может скомпилировать второй?
Является ли спецификацией call-super-constructor-must-be-first-statement более упрощенной, чем это должно было бы быть, или я что-то не хватает?
EDIT: это было неправильно отмечено как дубликат Почему это() и super() должны быть первым выражением в конструкторе?. Этот вопрос гораздо более общий и спрашивает, почему super() должно быть первым утверждением вообще. Вопрос в том, почему случай, подобный тому, который я опубликовал, победил бы эти требования (и на этот вопрос был удовлетворительно ответил)