Kotlin サポート

Doma は Kotlin 1.1.2を実験的にサポートしています。

Kotlin利用のベストプラクティス

クラスの定義やビルドに関する事柄について推奨する方法を記載します。

エンティティクラス

  • Data Classで定義する
  • イミュータブルで定義する( @Entityimmutable 要素に true を設定する)
  • コンストラクタは1つだけ定義する
  • コンストラクタ以外でプロパティを定義しない
  • コンストラクタで定義するプロパティには val を使用する
@Entity(immutable = true)
data class Person(
      @Id
      @GeneratedValue(strategy = org.seasar.doma.GenerationType.IDENTITY)
      val id: Int? = null,
      val name: Name,
      val address: Address)

ドメインクラス

  • Data Classで定義する
  • コンストラクタは1つだけ定義する
  • コンストラクタで定義するプロパティの名前は value にする
  • コンストラクタで定義するプロパティには val を使用する
@Domain(valueType = String::class)
data class Name(val value: String)

エンベッダブルクラス

  • Data Classで定義する
  • コンストラクタは1つだけ定義する
  • コンストラクタ以外でプロパティを定義しない
  • コンストラクタで定義するプロパティには val を使用する
@Embeddable
data class Address(val city: String, val street: String)

Daoインタフェース

  • KotlinではなくJavaで定義する
  • 更新処理の戻り値の型は org.seasar.doma.jdbc.Resultorg.seasar.doma.jdbc.BatchResult を使う
@Dao(config = AppConfig.class)
public interface PersonDao {
  @Select
  Person selectById(Integer id);
  @Insert
  Result<Person> insert(Person person);
}
val dao: PersonDao = ...
val person = Person(name = Name("Jhon"), address = Address(city = "Tokyo", street = "Yaesu"))
val (newPerson, count) = dao.insert(person)

kaptによるビルド

Kotlinで記述されたクラスやインタフェースに対して注釈処理をするには kapt を実行する必要があります。 kaptは実験的な位置付けにありドキュメントがありません。 Gradleでビルドする際は、確実な注釈処理が行われるように常に clean build を実行することを推奨します。

./gradlew clean build

Eclispeを利用する場合設定を適切に行えばJavaの注釈処理は自動で行われますが、kapt(Kotlinの注釈処理)はGradleを実行しない限り行われないことに注意してください。

下記はbuild.gradleの抜粋です。コンパイル時にSQLファイルを参照するために下記の設定に特に注意してください。

// コンパイルより前にSQLファイルを出力先ディレクトリにコピーするために依存関係を逆転する
compileJava.dependsOn processResources

// SQLファイルなどリソースファイルの出力先ディレクトリをkaptに伝える
kapt {
    arguments {
        arg("doma.resources.dir", processResources.destinationDir)
    }
}

JavaとKotlinの混在

kaptの不確実な挙動を避けるため、Domaに関するコードの全てをJavaで書くことは検討に値します。 Domaの利用において、JavaとKotlinの混在は問題ありません。

サンプルプロジェクト

サンプルコードについては下記のプロジェクトを参照ください。