[Kotlin+Thymeleaf] is〇〇はコンパイル後、isが消える!の対処法と理由
is〇〇はコンパイルされてisが消える!の対処法と理由解説
Boolean型のプロパティにはis〇〇と付けるのが一般的かと思いますが
Kotlin + Themeleaf の時、dataクラスなどで命名をis〇〇にすると,
コンパイル時にisが消されてうまく画面と疎通されない問題。
(isプレフィックスがコンパイルされて消えてしまい、画面との連携が崩れるという問題)
に直面したので今回はこれを書いていきたいと思います!!!
まずは結論:対処方法
対処法は2つある。
1. 名前変える
2. @JvmNameアノテーションをつける
@get:JvmName() @set:JvmName() など。
@JvmNameアノテーション
Javaとの相互運用性をサポートするための機能。
このアノテーションを使用すると、
isで始まる変数名に対して、生成されるJavaコードのメソッド名を指定できる。
これにより、Javaとの互換性を保ちながら問題を回避可能!
ex.
:
@get:JvmName("getCustomOpen")
@set:JvmName("setCustomOpen")
val isCustomOpen: Boolean
:
原因、解説
Kotlinは、最終的にJavaに変換、コンパイルされる。
Kotlinのdataクラスでは、Javaのgetter/setterメソッドが自動的に生成されが、
ここで注意が必要なのは、
変数名がisで始まる場合、生成されるメソッド名のルールが通常の変数名と異なるのだ。
これが今回の原因で、公式にも書かれている.
If the name of the property starts with is, a different name mapping rule is used:
the name of the getter will be the same as the property name, and the name of the setter will be obtained by replacing is with set. For example, for a property isOpen, the getter will be called isOpen() and the setter will be called setOpen(). This rule applies for properties of any type, not just Boolean.
通常の変数名(ex. open)の場合、
生成されるメソッド名は getOpen() と setOpen() だ。
しかし、変数名が isOpen の場合、
生成されるメソッド名は isOpen()(getter)と、 setOpen()(setter)となる。
ということでした。以上!
参考
公式: Properties
公式: Handling signature clashes with @JvmName
2024年初記事になりました⭐️
ここからしっかりまた2024年も継続で頑張って行こうと思います❤️がんばろー!
Discussion