在Kotlin数据类中调用超类构造函数之前的访问函数

Far*_*deh 6 java 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我试图在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
    }

}
Run Code Online (Sandbox Code Playgroud)

但我的IDE(Android Studio)正在强调fetchName(context)constructor用红色调用的部分.它显示以下消息:

fetchName在调用超类构造函数之前无法访问

我该如何解决这个问题?

mie*_*sol 10

您只能在完全构造的对象上使用成员函数.解决这个问题的一种方法是使用私有扩展函数或只是一个函数来获取名称:

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())
}
Run Code Online (Sandbox Code Playgroud)

虽然我确实认为使用Cursor有点太重了constructor.我会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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

  • 当扩展函数在类中时,它仍然是一个可以访问封闭类实例的所有成员的函数,因此需要**实例**. (3认同)

归档时间:

查看次数:

2551 次

最近记录:

9 年,1 月 前