Kotlinの注釈類の詳細解と実例

5443 ワード

Kotlinの注釈類の詳細解と実例
コメント
注釈は、メタデータをコードに付加する方法です。コメントを宣言するには、クラスの前にアンノテーションチャームを置いてください。

annotation class Fancy
注の付加的な属性は、注釈類を元注で表示することで指定できます。
  • @Targetは、注釈で表示できる要素の可能なタイプ(クラス、関数、属性、表現など)を指定します。
  • @Retensionはこの注釈がコンパイルされたclassファイルに格納されているかどうかを指定します。また、実行中に反射で見えるかどうかを指定します。
  • @Repeableは、単一の要素において同じ注釈を複数回使用することを可能にする。
  • @MusstBe Dcumentedは、この注釈が公有APIの一部であり、生成されたAPIドキュメントに表示されるクラスまたは方法の署名に含まれるべきであることを指定する。
  • @Target(AnnotationTarget.C LASS、AnnotationTarget.FUNTION、
            AnnotationTarget.VALE_PAAMETER,AnnotationTarget.EXPRESSION)
    @Retension(AnnotationRetension.SOURCE)
    @Must Be Dcumented
    annotation class Facy
    使い方
    
    @Fancy class Foo {
      @Fancy fun baz(@Fancy foo: Int): Int {
        return (@Fancy 1)
      }
    }
    
    クラスの主コンストラクタを表示する必要がある場合、コンストラクタ宣言にconstructorキーを追加し、その前に注解を追加する必要があります。
    
    class Foo @Inject constructor(dependency: MyDependency) {
      // ……
    }
    
    属性のアクセサを表示することもできます。
    
    class Foo {
      var x: MyDependency? = null
        @Inject set
    }
    
    構造関数
    注釈はパラメータを受け入れる構造関数を持つことができる。
    
    annotation class Special(val why: String)
    
    @Special("example") class Foo {}
    
    
    許可されたパラメータの種類は、次のとおりです。
  •  Java原生タイプに対応するタイプ(Int、Longなど)。
  • 文字列。
  • 類(Foo:class);
  • 列挙。
  • 他の注釈。
  • 上の列タイプの配列。
  • 注释パラメータは空きタイプがありません。JVMは注釈属性の値としてnullを保存することをサポートしていません。
    注釈が別の注釈のパラメータとして使用される場合、その名前は@文字をプレフィックスとしません。
    
    annotation class ReplaceWith(val expression: String)
    
    annotation class Deprecated(
        val message: String,
        val replaceWith: ReplaceWith = ReplaceWith(""))
    @Deprecated("This function is deprecated, use === instead", ReplaceWith("this === other"))
    
    クラスを注釈として指定するパラメータが必要な場合は、Ktlinクラスを使用してください。Kotlinコンパイラは自動的にJavaクラスに変換します。Javaコードはこの注釈とパラメータを正常に見ることができます。
    
    import kotlin.reflect.KClass
    
    annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>)
    
    @Ann(String::class, Int::class) class MyClass
    
    
    ランバー表現
    注釈はラmda表現にも使用できます。これらはラボダ式体を生成するinvoke()法に適用される。これはQuarのようなフレームワークに有用であり、  このフレームは注釈を用いて同時制御を行う。
    
    annotation class Suspendable
    
    val f = @Suspendable { Fiber.sleep(10) }
    
    注解使用先の目標
    属性または主構造関数パラメータを表示すると、対応するKotlin要素から生成されるJava要素が複数あるので、生成されたJavaバイトコードには複数の可能な位置がある。正確に指定するには、どうやって注釈を生成するべきかを指定します。
    
    class Example(@field:Ann val foo,  //    Java   
           @get:Ann val bar,   //    Java getter
           @param:Ann val quux)  //    Java       
    
    同じ文法を使ってファイル全体を表示することができます。これを行うには、ファイルの最上位、packageコマンドの前、またはすべてのインポート前に、ターゲットfileの注釈を置く(デフォルトのパケットの場合):
    
    @file:JvmName("Foo")
    
    package org.jetbrains.demo
    
    同じ目標に対して複数のコメントがある場合、ターゲットの重複を避けることができます。ターゲットの後ろに括弧を追加し、すべてのコメントを括弧に入れます。
    
    class Example {
       @set:[Inject VisibleForTesting]
       var collaborator: Collaborator
    }
    
    サポートされている使用先の完全なリストは以下の通りです。
  • file
  • property(このターゲットを持つ注釈はJavaには見えない)
  • field
  • get(属性getter)
  • set
  • receiver(拡張関数または属性の受信者パラメータ)
  • パラム
  • setparam
  • delegate(委託属性のためにその依頼例を格納するフィールド)
  • 拡張関数の受信者パラメータを表示するには、以下の構文を使用します。
    
    fun @receiver:Fancy String.myExtension() { }
    使用先のターゲットが指定されていない場合は、使用中のコメントの@Targetコメントに基づいてターゲットを選択します。複数の適用対象がある場合は、以下のリストの最初の適用対象を使用します。
  • param
  • property
  • field
  • Javaコメント
    Java注釈はKotlinと100%互換性があります。
    
    import org.junit.Test
    import org.junit.Assert.*
    import org.junit.Rule
    import org.junit.rules.*
    
    class Tests {
      //   @Rule         getter
      @get:Rule val tempFolder = TemporaryFolder()
    
      @Test fun simple() {
        val f = tempFolder.newFile()
        assertEquals(42, getTheAnswer())
      }
    }
    
    
    Javaで作成された注釈にはパラメータ順序が定義されていないので、従来の関数呼び出し文法を使用してパラメータを伝達することはできません。反対に、命名パラメータの文法が必要です。
    
    // Java
    public @interface Ann {
      int intValue();
      String stringValue();
    }
    // Kotlin
    @Ann(intValue = 1, stringValue = "abc") class C
    
    Javaにあるように、一つの特殊な状況はvalueパラメータです。その値は明示的な名前で指定する必要はありません。
    
    // Java
    public @interface AnnWithValue {
      String value();
    }
    // Kotlin
    @AnnWithValue("abc") class C
    
    Java中のvalueパラメータが配列タイプを持っていると、Kotlin中のvarargパラメータになります。
    
    // Java
    public @interface AnnWithArrayValue {
      String[] value();
    }
    // Kotlin
    @AnnWithArrayValue("abc", "foo", "bar") class C
    
    配列タイプの他のパラメータに対しては、アラーOfを明示的に使用する必要があります。
    
    // Java
    public @interface AnnWithArrayMethod {
      String[] names();
    }
    // Kotlin
    @AnnWithArrayMethod(names = arrayOf("abc", "foo", "bar")) class C
    
    注釈の例の値は、属性としてKtlinコードに露出される。
    
    // Java
    public @interface Ann {
      int value();
    }
    // Kotlin
    fun foo(ann: Ann) {
      val i = ann.value
    }
    
    
     読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。