Получи случайную криптовалюту за регистрацию!

Дано: проект с Gson и смешанным кодом на Java и Kotlin. Задача | Javanese Online

Дано: проект с Gson и смешанным кодом на Java и Kotlin.
Задача: пилить фичи, добавлять эндпоинты.
Хотелки:
1. Не иметь геттеров. Из существующего джавового кода они выглядят многословно.
2. Поля должны быть финальными. Не хочу нежданчиков в виде случайных присваиваний.
3. Нужны фоллбэки. Если опциональное поле не приходит, пусть у него будет удобное значение — emptyList() или "".

Вариант описывать данные на котлине с @JvmField я отмёл: многословно. За что боролись, об то и навернулись. Вместе с @SerializedName может и в строчку не уместиться.

Остаётся джава, поля объявил в таком виде:
@SerializedName("user_name") public final String userName = "";

Проблема первая: для такой конструкции у поля генерируется ConstantValue и инлайнится в места использования. В итоге Gson успешно переписывает финальные поля, но их уже никто не читает. Случай описан выше. Выход — таки унести присвоения в конструктор, как в B и C.

Проблема вторая: опциональное поле может прийти null. Тогда я хочу оставить фоллбэк.
Есть GsonBuilder#serializeNulls(), но мне нужно наоборот: не десериализовать нуллы. Настройки такой нет, конский ReflectiveTypeAdapterFactory копипастить ради одного ифа не хочется.

В итоге написал JsonReader, который эти нуллы пропускает.