Какова цель использования аннотации @field: SerializedName вместо @SerializedName? - PullRequest
0 голосов
/ 27 января 2020

Обычно я использую аннотацию @SerializedName для сопоставления полей JSON. Но в примерах проектов проектов компонентов архитектуры Google я вижу, что они используют аннотацию @field:SerializedName, и я не могу найти где-нибудь, чтобы прочитать цель использования этой аннотации @field.

Я новичок в Kotlin, и может кто-нибудь объяснить или поделиться ссылками на ссылки для чтения? Спасибо.

@Entity(
    indices = [
        Index("id"),
        Index("owner_login")],
    primaryKeys = ["name", "owner_login"]
)
data class Repo(
    val id: Int,
    @field:SerializedName("name")
    val name: String,
    @field:SerializedName("full_name")
    val fullName: String,
    @field:SerializedName("description")
    val description: String?,
    @field:SerializedName("owner")
    @field:Embedded(prefix = "owner_")
    val owner: Owner,
    @field:SerializedName("stargazers_count")
    val stars: Int
) {

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Это может помочь: из kotlin документов

Когда вы аннотируете свойство или первичный параметр конструктора, существует несколько Java элементов, которые генерируется из соответствующего элемента Kotlin и, следовательно, из нескольких возможных местоположений для аннотации в сгенерированном байт-коде Java. Чтобы указать, как именно должна создаваться аннотация, используйте следующий синтаксис:

class Example(@field:Ann val foo,    // annotate Java field
              @get:Ann val bar,      // annotate Java getter
              @param:Ann val quux)   // annotate Java constructor parameter
1 голос
/ 27 января 2020

Для упрощения, скажем, у вас есть:

data class Repo(
    @field:SerializedName("name")
    var name: String
)

Это объявляет класс данных и объявляет класс ' свойств в первичном конструктор . Kotlin свойства скомпилированы в поле, метод получения и, если изменяемый (т. Е. var), метод установки. Поскольку свойство объявлено в первичном конструкторе, оно также компилируется в параметр конструктора. Все это означает, что есть много мест, где аннотация может применяться в этом контексте: Kotlin свойство, поле, метод получения, параметр, метод установки или параметр установки. field: делает это явно, аннотация должна применяться к вспомогательному полю свойства. Из документации :

Аннотации Использование сайта цели

Когда вы аннотируете свойство или параметр первичного конструктора, существует несколько элементов Java которые генерируются из соответствующего элемента Kotlin и, следовательно, из нескольких возможных мест для аннотации в сгенерированном байт-коде Java. Чтобы указать, как именно должна создаваться аннотация, используйте следующий синтаксис:

class Example(@field:Ann val foo,    // annotate Java field
              @get:Ann val bar,      // annotate Java getter
              @param:Ann val quux)   // annotate Java constructor parameter

Тот же синтаксис можно использовать для аннотирования всего файла. Для этого поместите аннотацию с целью file на верхнем уровне файла, перед директивой пакета или перед всем импортом, если файл находится в пакете по умолчанию:

@file:JvmName("Foo")
package org.jetbrains.demo

Если у вас есть несколько аннотаций с одной и той же целью, вы можете избежать повторения цели, добавив скобки после цели и поместив все аннотации в скобках:

class Example {
     @set:[Inject VisibleForTesting]
     var collaborator: Collaborator
}

Полный список поддерживаемых целей сайта использования:

  • file;
  • property (аннотации с этой целью не видны для Java);
  • field;
  • get (получатель свойства);
  • set (установщик свойства);
  • receiver (параметр приемника функции расширения или свойства);
  • param (параметр конструктора);
  • setparam (параметр установщика свойства);
  • delegate (поле, в котором хранится экземпляр делегата для делегированного свойства).

Чтобы аннотировать параметр получателя функции расширения, используйте следующий синтаксис: * 1 062 *

fun @receiver:Fancy String.myExtension() { ... }

Если вы не укажете цель сайта использования, цель будет выбрана в соответствии с аннотацией @Target используемой аннотации. Если имеется несколько применимых целей, используется первая применимая цель из следующего списка:

  • param;
  • property;
  • field .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...