Вызов super() должен быть первым выражением в корпусе конструктора

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

Ответ 1

Java гарантирует, что вызов super (явный или нет) должен быть первым оператором в конструкторе. Это делается для того, чтобы часть подкласса объекта была инициализирована перед частью суперкласса инициализированного объекта.

В вашем случае вы ничего не делаете, кроме локальных "тривиальных вычислений", поэтому все рассмотрено, все будет хорошо. Однако компилятор Java не переходит к уровню определения того, выполняются ли операторы перед вызовом super любой инициализации. Он просто запрещает все утверждения до super().