21
Сен
2017

"Расширить" базовый класс до производного (?)

Есть класс-сущность для десерилиализации 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?
Будет ли это вообще корректно с точки зрения архитектуры?
Особенно учитывая, что такие поля будут доступны ещё и внутри пакета =/

Источник: https://ru.stackoverflow.com/questions/721218/%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B8%D1%82%D1%8C-%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B9-%D0%BA%D0%BB%D0%B0%D1%81%D1%81-%D0%B4%D0%BE-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%BD%D0%BE%D0%B3%D0%BE

Тебе может это понравится...

Добавить комментарий