1概要

このチュートリアルでは、https://kotlinlang.org/[Kotlin]から

@ JvmField

アノテーションを調べます。

Kotlinにはクラスとプロパティへのアプローチがあり、これはJavaで使用されるアプローチとは異なります。

@ JvmField

アノテーションは、2つの言語間の互換性を達成することを可能にします。


2フィールド宣言

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

この言語は自動的に値をフィールドの形で格納するプロパティへのバッキングフィールドを提供します。

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

これは簡単な例ですが、IntelliJでKotlinのDecompiler([ツール]>[Kotlin]>[Kotlin Decompilerの表示])を使用すると、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静的変数

注釈が便利になるもう1つの例は、nameオブジェクトまたはcompanionオブジェクトで宣言されたプロパティが静的バッキングフィールドを持つときです。

public class Sample {
    public static final int MAX__LIMIT = 20;
}

class Sample {
    companion object {
        @JvmField val MAX__LIMIT = 20
    }
}

4.使用法の例外

これまで、注釈を使用できる状況について説明しましたが、いくつかの制限があります。

注釈を使用できない状況がいくつかあります。

  • 私有財産


  • open



    override

    、および

    const

    修飾子を持つプロパティ

  • 委任プロパティ


5結論

この簡単な記事では、Kotlinの

@ JvmField

アノテーションのさまざまな使い方について説明しました。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[GitHubプロジェクト]にあります – これはMavenプロジェクトなので、簡単にできます。そのままインポートして実行します。