簡體   English   中英

在 Kotlin 數據類中調用超類構造函數之前的訪問函數

[英]Access function before calling superclass constructor in Kotlin data class

我在 Kotlin 中使用數據類來顯着減少我必須編寫的 Java 代碼量。

但是,在我的一個 Java 類中,我不確定如何在 Kotlin 中實現相同的結果。

我的 Java 類看起來有點像這樣:

public class DataObject {

    private int mId;
    private String mName;

    public DataObject(int id, String name) {
        mId = id;
        mName = name;
    }

    public DataObject(Context context, int id) {
        mId = id;
        Cursor cursor = ...
        cursor.moveToFirst();
        mName = cursor.getString(...);
        cursor.close();
    }

    public int getId() {
        return mId;
    }

    public String getName() {
        return mName;
    }

}

我試圖用 Kotlin 重寫它,到目前為止我有這個:

data class DataObject(val id: Int, val name: String) {

    constructor(context: Context, id: Int) : this(id, fetchName(context))

    private fun fetchName(context: Context): String {
        val cursor = ...
        cursor.moveToFirst()
        val name = cursor.getString(...)
        cursor.close()
        return name
    }

}

但是我的 IDE (Android Studio fetchName(context)在我的constructor fetchName(context)紅色強調了我調用fetchName(context)的部分。 它顯示以下消息:

在調用超類構造函數之前無法訪問fetchName

我應該如何解決這個問題?

您只能在完全構造的對象上使用成員函數。 解決這個問題的一種方法是使用私有擴展函數或簡單的函數來獲取名稱:

private fun Context.fetchName(): String {
    ///...
    return cursor.getString(1)
}

data class DataObject(val id: Int, val name: String) {
    constructor(context: Context, id: Int) : this(id, context.fetchName())
}

雖然我確實認為使用Cursorconstructor有點太繁重了。 我會像這樣使用單獨的Factory

data class DataObject(val id: Int, val name: String) {
    object FromCursorFactory {
        fun create(id: Int, context: Context): DataObject {
            val name = context.fetchName()
            return DataObject(id, name)
        }
    }
}

進一步閱讀:

另一種方法是使用伴隨對象。 這也將允許您在數據類之外調用該函數(在您的特定情況下可能沒有用)

data class DataObject(val id: Int, val name: String) {

  constructor(context: Context, id: Int) : this(id, fetchName(context))

  companion object {

    fun fetchName(context: Context): String {
      val cursor = ...
      ...
      return name
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM