我正在阅读结构化JSON,使用Play Frameworks'JSON读取以构建具有案例类的对象图。如何从Scala案例类中修饰不可变对象图形
一个例子:
case class Foo (
id: Int,
bar_id: Int,
baz_id: Int,
x: Int,
y: String
)
{
var bar: Bar = null
var baz: Baz = null
}
建设美孚之后,我必须稍后回来,并通过设置栏和巴兹装饰。这些都是在其他JSON文件中定义的,并且只在所有解析完成时才知道。但这意味着Foo不可能是不可改变的。
什么是Scala中的“正确”方式来创建一个不可变的对象,然后是它的装饰版本,而不是重复Foo的每个字段多次,一遍又一遍?
我知道几种方法,觉得不对劲:
- 使“栏:选项[酒吧]”和“巴兹:选项[巴兹]”案例类的参数,然后我可以使用“复制”使新版本的Foo类与他们设置了某些东西;但之后每次访问时都必须检查它们 - 效率低下,不安全,无法制作DecoratedFoo,只能保证正确的结构
- 创建第二个案例类,它是所有副本的粘贴在第一个结构中,但添加了两个额外的装饰参数 - 但这意味着回显定义中的整个参数列表,并在创建实例时再次显示它的实例
- 案例类继承显然是有争议的,并且在任何情况下也会出现无论如何,要求我重复每一个参数,在子类构造函数中?
- 使非案例超类列出常见案例类参数。然后在case类中扩展它。但是这似乎仍然需要在子类构造函数中重复每个单独的参数。
- 我看到有人在讨论这个问题,并在运行时使用反射来填充他们的装饰副本的基本属性 - 这避免了回声,但现在你没有类型安全性,将属性名称指定为字符串,开销等。
当然,Scala必须有办法让人们从简单的对象中编写更复杂的不可变对象,而不必手工复制它们的每一部分。
这对我来说也是一个痛点。在我看来,一般问题是声明一个核心数据模型,然后以DRY的方式定义派生/增强模型,这些模型是原始模型的变换。到目前为止,我还没有找到一个通用的解决方案。 – acjay 2015-02-24 15:34:27