【问题标题】:Do we need to avoid reflection when design scala libraries?在设计 scala 库时我们需要避免反射吗?
【发布时间】:2015-07-13 05:22:32
【问题描述】:

argonaut 为例,在我们的一些项目中,当需要处理 JSON 时,人们会为此使用 argonaut,并对字段进行硬编码,例如:

implicit def AddressCodecJson: CodecJson[Address] =
    casecodec3(Address.apply, Address.unapply)("street", "number", "post_code")

如果有很大的案例类,列表会很长:

implicit def AddressCodecJson: CodecJson[Address] =
    casecodec12(Address.apply, Address.unapply)("street", "number", "post_code", "...", "...", "...", "...", "...", "...", "...", "...", "...")

我的问题是,为什么我们需要对它们进行硬编码,而不是通过反射获取字段?

是否存在任何技术问题,或者人们在设计 Scala 库时不喜欢使用反射?

【问题讨论】:

  • 一般来说,反射很慢,不是线程安全的,最重要的是,在编译时不能证明任何事情。

标签: scala reflection argonaut


【解决方案1】:

我不是很清楚你是否试图一般地解析 json。我假设你想一般地解析任何 json。 如果是这种情况,您可以使用json4s 来执行此操作,而不是为每个案例类创建隐式转换。在这种情况下,您不需要为每个类提供隐式转换。我们在项目中广泛使用它。 您只需要为每种类型提供隐式转换器(例如:如何隐藏 java.sql.timestamp、java.sql.Date、Joda-Time 等)。

这个link 可能对你有帮助。

【讨论】:

  • 感谢json4s的推荐,我喜欢并在我的个人项目中使用它。我只是不清楚为什么人们要使用一种需要对所有内容进行硬编码的方法。我问了一些,他们不是很清楚,只是从旧项目中复制的
  • @Freewind:我也有同样的疑惑。但可能对于小型项目,人们发现进行案例类明智的隐式转换更容易。但我相信管理如此多的隐式转换太多了。我不确定它会对性能产生多大影响,但我更喜欢通用解决方案,因为随着项目的发展,它会让生活变得更轻松。
猜你喜欢
  • 2018-10-12
  • 1970-01-01
  • 2013-03-09
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多