Я читаю структурированный JSON, используя JSON для Play Frameworks, чтобы создать граф объектов с классами case.Как украсить неизменяемый граф объектов из классов шкалы scala
Пример:
case class Foo (
id: Int,
bar_id: Int,
baz_id: Int,
x: Int,
y: String
)
{
var bar: Bar = null
var baz: Baz = null
}
После построения Foo, я должен вернуться позже и украсить его, установив бар и БАЗ. Они определены в других файлах JSON и известны только при завершении всего разбора. Но это означает, что Foo не может быть неизменным.
Что такое «правильный» способ в Scala сделать неизменный объект, а затем украшенную его версию, не повторяя каждое поле Foo несколько раз снова и снова?
Я знаю несколько способов, которые чувствуют себя неправильно:
- грим «бар: Вариант [Бар]» и «БАЗ: Опция [Баз]» параметры класса регистра, а затем я могу использовать «копировать», чтобы сделать новые версии класса Foo с их набором чего-то; но тогда я должен проверять их каждый раз, когда они обращаются - неэффективны, небезопасны, не могут сделать DecoratedFoo, который, как гарантируется, имеет правильную структуру.
- сделать второй класс case, который является копией всех структура в первом, но добавление двух дополнительных декорированных параметров - но это означает повторение всего списка параметров в определении и снова при создании экземпляров его.
- Наследование класса класса, по-видимому, противоречиво и в любом случае также представляется требуют, чтобы я повторял каждый параметр в любом случае, в конструкторе подкласса?
- Внесите супер-класс, отличный от случая, в котором перечислены общие параметры класса случая. Затем расширьте его в классе case. Но это все равно потребует повторения каждого отдельного параметра в конструкторе подкласса.
- Я вижу блоги с людьми, которые говорят об этой проблеме и используют отражение во время выполнения, чтобы заполнить базовые атрибуты их украшенных копий - это позволяет избежать эха, но теперь у вас нет безопасности типа, указав имена атрибутов как строки, накладные расходы и т. Д. ...
Уверен, что у Scala должен быть способ, чтобы люди составляли более сложные неизменяемые объекты из более простых, без необходимости копировать каждую их часть вручную?
Это больная точка для меня. Мне кажется, что общая проблема заключается в объявлении базовой модели данных, а затем, сухим способом, определении производных/дополненных моделей, которые являются преобразованиями исходного. До сих пор я не нашел общего решения проблемы. – acjay