13

我刚刚意识到我不能在 scala 中有注释,这些注释在运行时被保存和分析。我也检查了这个问题,但我不太明白有什么替代方案。

  • DI - 一个答案提到scala中不需要DI框架。虽然在基本层面上可能是这种情况(尽管我不太喜欢那个例子;处理 DI 的惯用方式是什么?),像 spring 这样的 Java DI 框架非常先进,可以处理许多事情,比如计划作业、缓存、托管持久性等,全部通过注释,有时 - 自定义注释。

  • ORM - 我承认我没有尝试过任何原生 scala ORM,但从我在 squeryl 中看到的情况来看,它也使用了一些注释,这意味着它们是不可避免的吗?

  • 任何序列化工具 - 您如何习惯性地将序列化输出自定义为 JSON/XML/...?

  • Web 服务框架 - 您如何(在代码中)为 RESTful 或 SOAP 服务定义映射、标头等?

Scala 用户需要有一个混合 scala/java(用于注释)项目才能使用这些来自 Java 的设施?

元数据的原生 scala 替代品是否比注释更好?我还没有完全进入 scala 思维模式,因此与使用注释相比,大多数示例对我来说都很难看,所以请尝试更有说服力:)

4

1 回答 1

9

实际上,Scala确实有运行时保留的注解。不同之处在于它们不存储为 Java 注释,而是编码在二进制ScalaSignature注释的内容中(其本身是运行时保留的 Java 注释)。

因此,可以在运行时检索 Scala 注释,但不能使用 Java 反射,而必须使用 Scala 反射:

class Awesome extends StaticAnnotation

@Awesome
class AwesomeClass

import scala.reflect.runtime.universe._

val clazz = classOf[AwesomeClass]
val mirror = runtimeMirror(clazz.getClassLoader)
val symbol = mirror.classSymbol(clazz)
println(symbol.annotations) // prints 'List(Awesome)'

不幸的是,Scala 反射仍然被标记为实验性的并且在这一点上实际上是不稳定的(SI-6240SI-6826是相当严重的问题的例子)。尽管如此,从长远来看,它似乎是 Java 反射和注释最直接的替代品。

就目前而言,必须使用 Java 注释,我认为这仍然是一个不错的解决方案。

关于 DI/ORM/WS/序列化的框架和库 - Scala 在这方面似乎仍然不成熟,至少不像 Java 那样成熟。有很多针对这些问题的正在进行的项目,其中一些已经非常好,另一些仍在开发中。仅举几个我想到的:SquerylSlickSprayPickling

此外,Scala 有一些高级特性,这些特性常常使注释变得不必要。类型类(使用隐式参数实现)可能是一个很好的例子。

于 2013-08-27T20:02:03.517 回答