Android kotlin构造函数参数缺失?;

Android kotlin构造函数参数缺失?;,android,kotlin,constructor,android-glide,Android,Kotlin,Constructor,Android Glide,我为Glide编写了一个MaskShapeTransformation,所以我想在转换中传递一个可绘制的,并用原始位图绘制这个可绘制的,以产生遮罩效果 在开始时,我传递了一个像这样的绘图,并带有一个软引用,以避免出现memoryleak class MaskShapeTransformation(drawable: Drawable): BitmapTransformation() { private val weakDrawable = SoftReference(drawabl

我为Glide编写了一个MaskShapeTransformation,所以我想在转换中传递一个可绘制的,并用原始位图绘制这个可绘制的,以产生遮罩效果

在开始时,我传递了一个像这样的绘图,并带有一个软引用,以避免出现memoryleak

class MaskShapeTransformation(drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}
但是当我使用
weakDrawable.get()?
获取可绘制时,可绘制的为空

我不知道为什么,但我尝试了一切,直到我改变了我的构造函数,我只是像这样添加
val
到修改过的drawable中

class MaskShapeTransformation(val drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}
发生了一些惊人的事情,
weakDrawable.get()?
工作得很好!


我很困惑,有人能告诉我为什么吗?

第一点:
WeakReference
大概只会保留一个引用,只要其他东西也能保持引用

第二点:Kotlin构造函数语法意味着它们非常不同:

  • MaskShapeTransformation(可绘制:可绘制)
  • MaskShapeTransformation(val可绘制:可绘制)
第一个只是说必须将
Drawable
传递给构造函数。第二个也这么说,但也在类上创建一个字段,并使用传递的值初始化它。这意味着第二种形式为您提供了一个具有两个字段的对象:

  • drawable
    :保存传入的drawable
  • weakDrawable
    :弱引用包装
    drawable

把它们放在一起,现在你有了一个类,它有一个对Drawable的强引用,这意味着弱引用也将保持活动状态。

第一点:
WeakReference
将大致保持一个引用,只要其他引用也保持活动状态

第二点:Kotlin构造函数语法意味着它们非常不同:

  • MaskShapeTransformation(可绘制:可绘制)
  • MaskShapeTransformation(val可绘制:可绘制)
第一个只是说必须将
Drawable
传递给构造函数。第二个也这么说,但也在类上创建一个字段,并使用传递的值初始化它。这意味着第二种形式为您提供了一个具有两个字段的对象:

  • drawable
    :保存传入的drawable
  • weakDrawable
    :弱引用包装
    drawable
把它们放在一起,现在你有了一个类,它有一个对Drawable的强引用,这意味着弱引用也将保持活动