13

実行時に保存および分析される注釈をscalaに含めることができないことに気付きました。私もこの質問をチェックしましたが、代替手段が何であるかがよくわかりませんでした。

  • DI - scala には DI フレームワークは必要ないという回答がありました。基本的なレベルではそうかもしれませんが(私はその例があまり好きではありませんでしたが、DIを処理する慣用的な方法は何ですか?)、SpringのようなJava DIフレームワークはかなり高度で、スケジュールされたジョブ、キャッシング、管理されたジョブなどの多くのことを処理します持続性など、すべてアノテーションを介して、場合によってはカスタムアノテーションを使用します。

  • ORM - ネイティブの scala ORM を試したことがないことは認めますが、squeryl で見たところ、アノテーションも使用されています。つまり、アノテーションは避けられませんか?

  • 任意のシリアライゼーション ツール - JSON/XML/... へのシリアライゼーション出力を慣用的にカスタマイズするにはどうすればよいですか?

  • Web サービス フレームワーク - RESTful または SOAP サービスのマッピング、ヘッダーなどを (コードで) どのように定義しますか?

Scala ユーザーは、Java に由来するこれらの機能を使用するために、(注釈用の) ハイブリッド scala/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-6240またはSI-6826は非常に深刻な問題の例です)。それでも、長期的には、Java リフレクションとアノテーションの最も簡単な置き換えのように思えます。

今のところ、Java アノテーションを使用する必要がありますが、これはまだ優れたソリューションだと思います。

DI/ORM/WS/シリアライゼーションのフレームワークとライブラリに関して - Scala は、少なくとも Java ほどではなく、この分野ではまだ成熟していないようです。これらの問題を対象とした進行中のプロジェクトがたくさんあります。そのうちのいくつかはすでに本当に素晴らしいものであり、他はまだ開発中です。私の頭に浮かぶいくつかを挙げると、 SquerylSlickSprayPicklingです。

また、Scala には、注釈を不要にする高度な機能がいくつかあります。型クラス (暗黙のパラメーターで実装) は、おそらくその良い例です。

于 2013-08-27T20:02:03.517 に答える