我正在学习Play2框架并开始使用隐式函数。我正在将一些Position
对象转换为Json:
implicit val locationWrites = new Writes[Position] {
def writes(position: Position) = Json.obj(
"lat" -> position.lat,
"lon" -> position.lon
)
}
我应该这样做:
object JsonConversion {
implicit val locationWrites = new Writes[Position] {
def writes(position: Position) = Json.obj(
"lat" -> position.lat,
"lon" -> position.lon
)
}
}
或者我应该这样做:
class JsonConversion {
implicit val locationWrites = new Writes[Position] {
def writes(position: Position) = Json.obj(
"lat" -> position.lat,
"lon" -> position.lon
)
}
}
然后导入此class
或object
,其中将使用这些隐式函数。
这些隐式函数的实例和可伸缩性方面的根本区别是什么,例如,如果要以并发方式调用它们?
答案 0 :(得分:1)
两者都不是。有一种更清洁的方法可以将您的所有域名保持在一起,以及人们通常会忘记的内容。 您可以将隐含置于随播对象
这是你应该真正把它们放在哪里:
class Position { ... }
object Position {
implicit val positionWrites = new Writes[Position] {
def writes(position: Position) = Json.obj(
"lat" -> position.lat,
"lon" -> position.lon
)
}
}
默认情况下,隐式分辨率将查看伴随对象。这可以防止域分散,并且不会有任何奇怪的文件充满JSON格式。您可以将事物保存在正确的位置,如果您更新课程,很容易知道哪些内容需要更改。
另一方面,Play使用一些有趣的宏来生成更高级的JSON格式。您可以使用Json.format[Type]
或Json.writes[Type]
或仅使用Json.reads[Type]
来生成所需的格式,而无需手动操作。
implicit val positionFormat = Json.format[Position]
答案 1 :(得分:0)
只需将隐式方法放在对象中,然后以这种方式导入:
import JsonConversion._
从性能的角度来看,您不应该有任何顾虑,因为可以执行许多调用而没有任何副作用。