Kotlin делегирует использование памяти - PullRequest
2 голосов
/ 08 мая 2020

При разработке приложения чата android было создано несколько классов с использованием делегатов Kotlin. Эти классы часто используются и передаются между классами; Итак, я хотел бы спросить вас об использовании памяти при наличии такой структуры классов на примере одного из таких случаев.

Конкретный класс ImageMessage, который использует Kotlin делегатов:

open class ImageMessage(
    image: AppImage,
    val timestamp: Long
) : AppImage by image

Это интерфейс AppImage, используемый в ImageMessage:

interface AppImage {
    var firebaseStorageUrl: String
    val image: Bitmap
}

В приложении чата присутствуют 2 коллекции: одна - это список анонимных объектов, реализующих AppImage, а другая - список сообщений ImageMessages, которые были созданы с помощью анонимные классы.

Примерно так:

val image = object : AppImage{...}
imagesList.add(image)
val imageMessage = ImageMessage(image, System.currentTimeInMillis())
imageMessageList.add(imageMessage)

Вопрос: приводит ли эта реализация к сохранению 2 растровых изображений или один растровый объект связан дважды? Увидев новый для меня синтаксис делегатов, я сомневаюсь при ответе на вопрос; Итак, прошу Вашей помощи!

1 Ответ

2 голосов
/ 08 мая 2020

Посмотрите, когда его разложили на Java. Во-первых, ImageMessage реализует AppImage и метод переопределения getFirebaseStorageUrl и getImage возвращаемое значение зависит от AppImage image. Таким образом, это означает, что будет создан только один экземпляр Bitmap, который пройдет через экземпляр изображения.

public class ImageMessage implements AppImage {
   private final long timestamp;
   // $FF: synthetic field
   private final AppImage $$delegate_0;

   public final long getTimestamp() {
      return this.timestamp;
   }

   public ImageMessage(@NotNull AppImage image, long timestamp) {
      Intrinsics.checkParameterIsNotNull(image, "image");
      super();
      this.$$delegate_0 = image;
      this.timestamp = timestamp;
   }

   @NotNull
   public String getFirebaseStorageUrl() {
      return this.$$delegate_0.getFirebaseStorageUrl();
   }

   public void setFirebaseStorageUrl(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.$$delegate_0.setFirebaseStorageUrl(var1);
   }

   @NotNull
   public Bitmap getImage() {
      return this.$$delegate_0.getImage();
   }
}

Простой способ понять - объявить ImageMessage следующим образом:

open class ImageMessage(override var firebaseStorageUrl: String, override val image: Bitmap, val timestamp: Long) : AppImage

firebaseStorageUrl и image являются реализовано AppImage.

open class ImageMessage(
    abc: AppImage,
    val timestamp: Long
) : AppImage by abc

Этот класс ImageMessage реализует AppImage посредством делегатов, но, по сути, это тот же самый ImageMessage, который явно реализует AppImage, как указано выше.

Ps: I просто измените имя делегата, чтобы вам было легче понять.

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