Kotlin 父类和子类初始化顺序



我有一个视图SubEpoxyRecyclerView,那是我的父类EpoxyRecyclerView的一个子类。初始化此视图时,超类EpoxyRecyclerView调用构造函数主体中setItemSpacingPx(Int)的方法。

调用此方法时,我的类变量都不会初始化!应用程序在线崩溃itemDecorator.pxBetweenItems指出itemDecorator为空,这是不可能的

子类(Kotlin):

class SubEpoxyRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
    : EpoxyRecyclerView(context, attrs, defStyleAttr) {
    private val itemDecorator: Decor = Decor()
    private val someInt: Int = 5
    private var someBoolean: Boolean = true
    override fun setItemSpacingPx(spacingPx: Int) {
        // Called from superclass. Debug: itemDecorator is null, 
        // someInt is 0, someBoolean is false
        removeItemDecoration(itemDecorator)
        itemDecorator.pxBetweenItems = spacingPx
        if (spacingPx > 0) {
            addItemDecoration(itemDecorator)
        }
    }
}

超类(Java - 库):

public class EpoxyRecyclerView extends RecyclerView {
  public EpoxyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    if (attrs != null) {
      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.EpoxyRecyclerView,
          defStyleAttr, 0);
      setItemSpacingPx(a.getDimensionPixelSize(R.styleable.EpoxyRecyclerView_itemSpacing, 0));
      a.recycle();
    }
    init();
  }
}

很正常。初始化顺序为

  1. 父类
  2. 儿童类

看看这个例子,了解为什么你的代码不起作用:

open class Parent {
  init { print("parent ") } 
}
class Child : Parent() {
  init { print("child ") } 
}
fun main(args: Array<String>) {
  Child() 
}

根据上面的例子,main 方法首先打印"父",然后打印"子"。在您的例子中,SubEpoxyRecyclerView 类的变量不会初始化,因为一旦 EpoxyRecyclerView 的初始化完成,类本身就会被初始化。

最新更新