在设计android聊天应用程序时,使用Kotlin委托(delegate)创建了几个类。这些类经常在类之间使用和传递。因此,我想问你一个例子,在这种情况下,具有这样的类结构的内存使用情况。

使用Kotlin委托(delegate)的具体类ImageMes​​sage:

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

这是ImageMes​​sage中使用的AppImage接口(interface):
interface AppImage {
    var firebaseStorageUrl: String
    val image: Bitmap
}

在聊天应用程序中,存在2个集合:一个是实现AppImage的匿名对象的列表,另一个是在匿名类的帮助下创建的ImageMes​​sages的列表。

有点像这样:
val image = object : AppImage{...}
imagesList.add(image)
val imageMessage = ImageMessage(image, System.currentTimeInMillis())
imageMessageList.add(imageMessage)

问题:此实现会导致存储2个位图图像还是将一个位图对象链接两次?在我看来,新的代表语法使我在回答问题时犹豫不决;所以,请你帮忙!

最佳答案

看一下将其分解为Java时的情况。首先,ImageMes​​sage实现AppImage并根据getFirebaseStorageUrl覆盖方法getImageAppImage 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();
   }
}

易于理解的方法是声明ImageMes​​sage,如下所示:
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

此类ImageMes​​sage通过委托(delegate)来实现AppImage,但是,本质上,它是与上述显式实现AppImage相同的ImageMes​​sage。

附注:我只是更改代表的姓名以帮助您理解。

关于android - Kotlin委托(delegate)内存使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61670041/

10-09 09:08