Help us understand the problem. What is going on with this article?

KotlinでDoma2のEnumドメインクラスを実現する方法

この記事を書くモチベーション

現在担当しているKotilnで書かれたプロダクトにDomaを新規に採用しようとしています。
しかし、Kotlinの理解がまだ浅くEnumのドメインクラス化に苦戦してしまいました。

最終的には実現できたのですが(簡単な設定だったけど時間がかかってしまいましたorz)、おそらく同じように苦戦している人もいると思い、そんな人達に向けてQiitaに解説記事を投稿しておきます。1

何はともあれサンプルコード 〜コード解説〜

Enumのドメインクラス

package sample

import org.seasar.doma.Domain

@Domain(valueType = String::class, accessorMethod = "getCode", factoryMethod = "of")
// if you use enum without additional value and also do not use its value for database, you can do like this.
//@Domain(valueType = String::class, accessorMethod = "name", factoryMethod = "valueOf")
enum class Gender(val code: String) {
    MALE("0"),
    FEMALE("1");

    companion object {
        @JvmStatic // doma requires JvmStatic annotation for factory method
        fun of(code: String): Gender =
            values().firstOrNull { it.code == code } ?: throw IllegalArgumentException("${Gender::class.simpleName} does not have such code => $code")
    }
}

ポイントは@DomainアノテーションのaccessorMethodfactoryMethodです。

accessorMethod

Kotlinをcompileして生成されるJavaのclassでは、kotlinのプロパティにgetのプレフィックスをつけたgetterが生えるので、その名前に合わせてaccessorMethodをつけています。

factoryMethod

@DomainfactoryMethodにはJavaのstaticなメソッドを指定します。
Kotlinで同じものに該当するのはコンパニオンオブジェクトですが、コンパニオンオブジェクトはそのままだと対象クラスにCompanionという名前で内部クラスを生成し、そのクラス経由でアクセスできるようになります。

e.g.) SomeClass.Companion.staticMethod()

しかし、Domaはそんなことを知らないのでfactoryMethodで指定されたメソッドを探しに行きますが、Companion経由でしかアクセスできない状態なのでコンパイルエラーになります。

そのため、staticメソッドのように見えるために@JvmStaticをつけて上げる必要があります。

最後に

簡単な内容でしたが、以上でKotlinでもEnumのドメインクラスが使えるようになりました。
この記事で、本質的ではないところで時間の浪費をする人が減ってくれるといいな…

doma kotlin-sample

ちなみに、domaのkotlin-sampleにもPRを送りマージして頂きました。
送ってすぐにマージして頂けました、感謝です。

以上です。


  1. Qiitaやはてなブログなどに投稿しておけば検索にHITしやすいはず 

yushi_koga
好きなものは奥様と酒とOOPとDDD 好きな日本酒は「こんな夜に 鹿」 http://www.senjyo.co.jp/item2_56.html
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした