在设计android聊天应用程序时,使用Kotlin委托(delegate)创建了几个类。这些类经常在类之间使用和传递。因此,我想问你一个例子,在这种情况下,具有这样的类结构的内存使用情况。
使用Kotlin委托(delegate)的具体类ImageMessage:
open class ImageMessage(
image: AppImage,
val timestamp: Long
) : AppImage by image
这是ImageMessage中使用的AppImage接口(interface):
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个位图图像还是将一个位图对象链接两次?在我看来,新的代表语法使我在回答问题时犹豫不决;所以,请你帮忙!
最佳答案
看一下将其分解为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通过委托(delegate)来实现AppImage,但是,本质上,它是与上述显式实现AppImage相同的ImageMessage。
附注:我只是更改代表的姓名以帮助您理解。
关于android - Kotlin委托(delegate)内存使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61670041/