読者です 読者をやめる 読者になる 読者になる

[Scala]アノテーションを使う

Javaコードとpackage objectを組み合わせるのが良い?
sbt使っているならJavaソースコード含んでいてもコンパイル問題無いので、割りと簡単
ただ、Javaコードをsrc/main/javaの下に置くか、src/main/scalaに混ぜるかはライブラリごとに種類がある感じ?
SquerylなんかはScalaコードと同じところにある
https://github.com/max-l/Squeryl/blob/master/src/main/scala/org/squeryl/annotations/Transient.java

Ignore.java

package my.library.annotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Ignore {
}

コンストラクタにアノテーション付けたときに判別するために@fieldを付ける必要がある
http://stackoverflow.com/questions/3769624/annotating-constructor-parameters-in-scala
なので、package object を使って簡略化するといい

package.scala

package my.library

import scala.annotation.target.field
import my.library.annotations._

package object annotations {
  type ignore = Ignore @field
}

アノテーション使うScalaコードはこんな感じ

package my.library

import my.library.annotations._

case class User(
  name: String,
  @ignore age: Int
) {
  @ignore val test = ""
}

チェックするときは

classOf[User].getDeclaredFields
  .map(_.getAnnotation(classOf[Ignore]))

とかやるとわかる。