Класс данных Kotlin с переменными аннотаций SerializedName в блоке инициализации - PullRequest
0 голосов
/ 14 января 2019

У меня есть класс данных ниже. Использование сопрограмм и преобразование результатов в качестве объектов UserItem с помощью gson.

Проблема в том, что в блоке init объект по-прежнему не инициализирован, а переменные nick, images и т. Д. Пусты. Где я должен написать код в блоке инициализации?

data class UserItem(
    @SerializedName("username") val nick: String = "",
    @SerializedName("full_name") val fullName: String = 0,
    @SerializedName("info") val bio: String = "",
    @SerializedName("images") val images: List<String> = 
arrayListOf(),
    var imageType: ImageType = ImageType.NO_PHOTO
){
    companion object {
        @JvmStatic
        val DISPLAY_TYPE_USER = 0
        @JvmStatic
        val DISPLAY_TYPE_INFO = 1
    }

    enum class ImageType {
        NO_PHOTO, SINGLE_PHOTO, MULTIPLE_PHOTO
    }

    init {
        if (images.size == 1)
            imageType = ImageType.SINGLE_PHOTO
        else if (images.size > 1)
            imageType = ImageType.MULTIPLE_PHOTO
    }
}

1 Ответ

0 голосов
/ 14 января 2019

То, что у вас есть выше, отлично работает для меня, используя kotlin 1.3.11 с незначительной детализацией - @SerializedName("full_name") val fullName: String = 0 не может быть целым числом, поэтому я изменил его на @SerializedName("full_name") val fullName: String = "".

На самом деле, работает это:

fun main(args: Array<String>) {
  println(UserItem().imageType)
  println(UserItem(images = listOf("foo")).imageType)
  println(UserItem(images = listOf("foo", "bar")).imageType)
}

Выходы:

NO_PHOTO
SINGLE_PHOTO
MULTIPLE_PHOTO

Что по вашей логике правильно. Когда вы декомпилируете класс UserItem, вы увидите следующий конструктор:

public UserItem(@NotNull String nick, @NotNull String fullName, @NotNull String bio, @NotNull List images, @NotNull UserItem.ImageType imageType) {
  Intrinsics.checkParameterIsNotNull(nick, "nick");
  Intrinsics.checkParameterIsNotNull(fullName, "fullName");
  Intrinsics.checkParameterIsNotNull(bio, "bio");
  Intrinsics.checkParameterIsNotNull(images, "images");
  Intrinsics.checkParameterIsNotNull(imageType, "imageType");
  super();
  this.nick = nick;
  this.fullName = fullName;
  this.bio = bio;
  this.images = images;
  this.imageType = imageType;

  // This is what you have in the init block
  if (this.images.size() == 1) {
     this.imageType = UserItem.ImageType.SINGLE_PHOTO;
  } else if (this.images.size() > 1) {
     this.imageType = UserItem.ImageType.MULTIPLE_PHOTO;
  }
}

Как видите, блок init встроен после конструктора. Может быть, я неправильно понял проблему?

PS: Вы можете легко проверить то же самое, выполнив «Показать байт-код котлина», и появится окно с кнопкой «Декомпилировать», которое покажет вам код Java.

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