Kotlin @JvmFieldへのガイド

Kotlin @JvmFieldのガイド

1. 概要

このチュートリアルでは、Kotlinから@JvmFieldアノテーションを調べます。

Kotlinにはクラスとプロパティに対するアプローチがあり、Javaで使用されるアプローチとは異なります。 @JvmFieldアノテーションにより、2つの言語間の互換性を実現できます。

2. フィールド宣言

デフォルトでは、Kotlinクラスはフィールドを公開しませんが、代わりにプロパティを公開します。

この言語は、プロパティにバッキングフィールドを自動的に提供し、その値はフィールドの形式で保存されます。

class CompanionSample {
    var quantity = 0
    set(value) {
        if(value >= 0) field = value
    }
}

これは簡単な例ですが、IntelliJでKotlinのデコンパイラー([ツール]> [Kotlin]> [Kotlinデコンパイラーの表示])を使用すると、Javaでどのように表示されるかがわかります。

public class JvmSample {
   private int quantity;

   // custom getter

   public final void setQuantity(int value) {
      if (value >= 0) {
         this.quantity = value;
      }
   }
}

ただし、これはフィールドをまったく持つことができないという意味ではありません。必要な特定のシナリオがあります。 この場合、@JvmFieldアノテーションを利用できます。これは、プロパティのゲッターとセッターを生成せず、単純なJavaフィールドとして公開するようにコンパイラーに指示します。

Kotlinの例を見てみましょう。

class KotlinJvmSample {
    @JvmField
    val example = "Hello!"
}

そして、そのJavaは逆コンパイルされました。実際、フィールドが標準のJava方式で公開されたことを証明しています。

public class KotlinJvmSample {
    @NotNull
    public final String example = "Hello!";
}

3. 静的変数

注釈が役立つ別の例は、名前オブジェクトまたはコンパニオンオブジェクトで宣言されたプロパティに静的バッキングフィールドがある場合です。

public class Sample {
    public static final int MAX_LIMIT = 20;
}
class Sample {
    companion object {
        @JvmField val MAX_LIMIT = 20
    }
}

4. 使用の例外

これまで、アノテーションを使用できる状況について説明してきましたが、いくつかの制限があります。

注釈を使用できない状況を次に示します。

  • 私有財産

  • openoverrideconst修飾子を持つプロパティ

  • 委任されたプロパティ

5. 結論

この簡単な記事では、Kotlinの@JvmFieldアノテーションを使用するさまざまな方法について説明しました。

これらすべての例とコードスニペットの実装は、GitHub projectにあります。これはMavenプロジェクトであるため、そのままインポートして実行するのは簡単です。