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. 静的変数

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

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アノテーションを使用するさまざまな方法について説明しました。

これらすべての例とコードスニペットの実装は、GitHubプロジェクトにあります。