🐈

[Kotlin+Thymeleaf] is〇〇はコンパイル後、isが消える!の対処法と理由

2024/01/23に公開

is〇〇はコンパイルされてisが消える!の対処法と理由解説

Boolean型のプロパティにはis〇〇と付けるのが一般的かと思いますが
Kotlin + Themeleaf の時、dataクラスなどで命名をis〇〇にすると,
コンパイル時にisが消されてうまく画面と疎通されない
問題。
(isプレフィックスがコンパイルされて消えてしまい、画面との連携が崩れるという問題)

に直面したので今回はこれを書いていきたいと思います!!!

まずは結論:対処方法

対処法は2つある。
1. 名前変える
2. @JvmNameアノテーションをつける
@get:JvmName() @set:JvmName() など。

@JvmNameアノテーション

Javaとの相互運用性をサポートするための機能。
このアノテーションを使用すると、
isで始まる変数名に対して、生成されるJavaコードのメソッド名を指定できる。
これにより、Javaとの互換性を保ちながら問題を回避可能!

ex.

data.kt
@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