|
| 1 | +================== |
| 2 | +Kotlin サポート |
| 3 | +================== |
| 4 | + |
| 5 | +.. contents:: 目次 |
| 6 | + :depth: 3 |
| 7 | + |
| 8 | +Doma は `Kotlin <https://kotlinlang.org/>`_ を実験的にサポートしています。 |
| 9 | + |
| 10 | +Kotlin利用のベストプラクティス |
| 11 | +================================ |
| 12 | + |
| 13 | +クラスの定義やビルドに関する事柄について推奨する方法を記載します。 |
| 14 | + |
| 15 | +エンティティクラス |
| 16 | +------------------- |
| 17 | + |
| 18 | +* Data Classで定義する |
| 19 | +* イミュータブルで定義する( `@Entity` の `immutable` 要素に `true` を設定する) |
| 20 | +* コンストラクタは1つだけ定義する |
| 21 | +* コンストラクタ以外でプロパティを定義しない |
| 22 | +* コンストラクタで定義するプロパティには `val` を使用する |
| 23 | +* 継承は使わない |
| 24 | + |
| 25 | +.. code-block:: java |
| 26 | +
|
| 27 | + @Entity(immutable = true) |
| 28 | + data class Person( |
| 29 | + @Id |
| 30 | + @GeneratedValue(strategy = org.seasar.doma.GenerationType.IDENTITY) |
| 31 | + val id: Int? = null, |
| 32 | + val name: Name, |
| 33 | + val address: Address) |
| 34 | +
|
| 35 | +ドメインクラス |
| 36 | +------------------- |
| 37 | +
|
| 38 | +* Data Classで定義する |
| 39 | +* コンストラクタは1つだけ定義する |
| 40 | +* コンストラクタで定義するプロパティの名前は `value` にする |
| 41 | +* コンストラクタで定義するプロパティには `val` を使用する |
| 42 | +
|
| 43 | +.. code-block:: java |
| 44 | +
|
| 45 | + @Domain(valueType = String::class) |
| 46 | + data class Name(val value: String) |
| 47 | +
|
| 48 | +エンベッダブルクラス |
| 49 | +---------------------- |
| 50 | +
|
| 51 | +* Data Classで定義する |
| 52 | +* コンストラクタは1つだけ定義する |
| 53 | +* コンストラクタ以外でプロパティを定義しない |
| 54 | +* コンストラクタで定義するプロパティには `val` を使用する |
| 55 | +* 継承は使わない |
| 56 | +
|
| 57 | +.. code-block:: java |
| 58 | +
|
| 59 | + @Embeddable |
| 60 | + data class Address(val city: String, val street: String) |
| 61 | +
|
| 62 | +Daoインタフェース |
| 63 | +------------------- |
| 64 | +
|
| 65 | +* SQLファイルとマッピングする場合は `@ParameterName` を使ってメソッドのパラメータに名前をつける |
| 66 | +* 更新処理の戻り値の型は `org.seasar.doma.jdbc.Result` や `org.seasar.doma.jdbc.BatchResult` を使う |
| 67 | +
|
| 68 | +.. code-block:: java |
| 69 | +
|
| 70 | + @Dao(config = AppConfig::class) |
| 71 | + interface PersonDao { |
| 72 | + @Select |
| 73 | + fun selectById(@ParameterName("id") id: Int): Person |
| 74 | + @Insert |
| 75 | + fun insert(person: Person): Result<Person> |
| 76 | + } |
| 77 | +
|
| 78 | +* 更新処理の戻り値を扱う際は `Destructuring Declarations <https://kotlinlang.org/docs/reference/multi-declarations.html>`_ を使う |
| 79 | +
|
| 80 | +.. code-block:: java |
| 81 | +
|
| 82 | + val dao: PersonDao = ... |
| 83 | + val person = Person(name = Name("Jhon"), address = Address(city = "Tokyo", street = "Yaesu")) |
| 84 | + val (newPerson, count) = dao.insert(person) |
| 85 | +
|
| 86 | +
|
| 87 | +katpによるビルド |
| 88 | +------------------- |
| 89 | +
|
| 90 | +Kotlin で記述されたクラスやインタフェースに対して注釈処理をするには `kapt <http://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/>`_ を実行する必要があります。 |
| 91 | +2016年5月現在、Kotlin 1.0.2のkaptは機能が不足しておりかつ動作が不安定です。また、ドキュメントがありません。 |
| 92 | +Daoインタフェースで `@ParameterName` を用いて明示的に名前をつけることを推奨するのも kapt の不具合に由来します。 |
| 93 | +不安定な挙動を避けるため、Gradleでビルドする際、常に `clean build` を実行することを推奨します。 |
| 94 | +
|
| 95 | +.. code-block:: sh |
| 96 | +
|
| 97 | + ./gradlew clean build |
| 98 | +
|
| 99 | +Eclispeを利用する場合設定を適切に行えばJavaの注釈処理は自動で行われますが、kapt(Kotlinの注釈処理)はGradleを実行しない限り行われないことに注意してください。 |
| 100 | +
|
| 101 | +JavaとKotlinの混在 |
| 102 | +------------------------- |
| 103 | +
|
| 104 | +kaptの不具合を避けるため、Domaに関するコードの全てもしくは一部をJavaで書くことは検討に値します。 |
| 105 | +特に、DaoについてはJavaで書いても良いかもしれません。 |
| 106 | +JavaとKotlinで記述量にほとんど差がなく、 `@ParameterName` を使う必要性を避けられるためです。 |
| 107 | +Domaの利用において、JavaとKotlinの混在は特に問題ありません。 |
| 108 | +
|
| 109 | +サンプルプロジェクト |
| 110 | +===================== |
| 111 | +
|
| 112 | +サンプルコードについては下記のプロジェクトを参照ください。 |
| 113 | +
|
| 114 | +* `kotlin-sample <https://github.com/domaframework/kotlin-sample>`_ |
0 commit comments