Есть класс-сущность для десерилиализации json.
Пусть он будет таким:
public class _BaseJsonModel {
public int field1;
public String field2;
}
Теперь у нас есть класс-модель для работы непосредственно в коде:
public class BaseModel {
private int field1;
private String field2;
public int getField1() { return field1; }
public String getField2() { return field2; }
}
Почему я не объявил сразу один класс правильно и не использовал его же для считывания? - Мне не совсем нравится возвращаемая Json-структура, так будет проще адаптироваться, если в API что-то сильно измениться, ну и, собственно, все изменения данных должны идти через запросы на сервер, а эти модели лишь для удобного чтения, а значит и сеттеров быть не должно.
Загвостка в том, что есть расширенная версия этой же модели, т.е. всё те же поля с теми же данными плюс ещё пару. Чтобы не дублировать код, я создаю производные от базовых классов модели, добавляя дополнительные поля.
Примерно вот так:
public class _JsonModel extend _BaseJsonModel {
public String field3;
}
И соответственно:
public class Model extend BaseModel {
private String field3;
public String getField3() { return field3; }
}
Далее я думал просто написать конструкторы, которые бы принимали в качестве аргумента json-модель и инициализировали соответствующие поля. И всё вроде бы отлично даже учитывая ограничение Java на то, что вызов конструктора базового (супер) класса должен быть в самом начале.
Загвоздка в том, что эти json-модели есть поля в более сложной структуре и там они могут быть null. Соответственно, мне хотелось бы, чтобы в таком случае и мои классы-модели были null, что не работает с конструктором, ибо даже если я конструктору в качестве аргумента отдам null, компилятор выделит переменной память и ссылаться она будет уже не на null.
Тогда я подумал, что можно было бы создать статический метод, который бы принимал json-модель и отдавал бы null, если json-модель ссылается на null и готовый объект в обратном случае.
С базовым классом всё оказалось отлично:
public static BaseModel convertFromJsonModel(_BaseJsonModel _baseJsonModel){
if (_baseModel == null) { return null; }
BaseModel baseModel = new BaseModel();
baseModel.field1 = _baseJsonModel.field1;
baseModel.field2 = _baseJsonModel.field2;
return baseModel;
}
Проблемы начались, когда мне потребовалось создать аналогичный метод в производном классе. Если я попытаюсь сделать аналогично, то столкнусь с проблемой того, что я не смогу инициализировать два поля из базового класса, ибо не имею к ним доступа и сеттеров у них нет.
public static Model convertFromJsonModel(_JsonModel _jsonModel){
if (_jsonModel == null) { return null; }
Model model = new Model();
//super.field1 = _jsonModel.field1; (?)
//super.field2 = _jsonModel.field2; (?)
model.field3 = _jsonModel.field3;
return model;
}
UPD:
Неужели единственный выход это объявление полей базового класса как protected?
Будет ли это вообще корректно с точки зрения архитектуры?
Особенно учитывая, что такие поля будут доступны ещё и внутри пакета =/
Свежие комментарии