はじめに
変数名のprefixとしてisを付けて、is~で始まる変数を作成することは多いかと思います。
今回はKotlinの上記変数をThymeleafで参照する場合に発生した現象とその対応を記載します。
なお、バージョンはそれぞれ以下となります。
Kotlin: 1.3.61
Thymeleaf: 3.0.11
現象
data class Hoge( val isFuga: Boolean )
上記のクラスをThymeleafで参照するとき、以下のように記載しエラーとなりました。
<div th:text="${hoge.isFuga}"></div>
対応
<div th:text="${hoge.isFuga()}"></div>
原因
Kotlinという言語は最終的にJavaに変換されてコンパイルされます。
KotlinのdataクラスにおけるJavaのgetter/setterメソッドは自動で作成されるのですが、そのときにis~で始まる変数名の場合のみ生成されるメソッド名のルールが異なり以下のようになっています。
- 変数名がfugaの場合:getFuga()/setFuga()
- 変数名がisFugaの場合:isFuga()/setFuga()
※isIsFuga()/setIsFuga()ではありません。
おそらく英文としての繋がりが自然となるようにこのような仕様になっているのではと推測しています。
この仕様は公式にも記載されています。
一方、Thymeleafではhoge.isFugaと記載されていて型がbooleanの場合、
hogeエンティティのisIsFuga()からisFugaを取得しようとします。
※boolean型のためisIsFuga()となりますが、stringなど他の型でもgetIsFuga()となるため同様の現象は発生します
上記差異によって今回の現象が発生します。
補足
前述のとおりの問題があるため、個人的にはKotlinのプロパティ名に限らず、複数の技術で利用するものにはis~で始まる変数名は付与しない方がよいかと考えています。
※そのうち記事にするかもしれませんが、Kotlin/OpenAPI/Angularでもis~が原因でうまく変数参照できないことがありました