I'm using data classes in Kotlin to significantly reduce the amount of Java code I would otherwise have to write.

但是,在我的一个Java类中,我不确定如何在Kotlin中实现同样的结果.

My Java class looks a bit like this:

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;
    }

}

I've tried to rewrite it in Kotlin, and so far I have this:

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
    }

}

But my IDE (Android Studio) is underlining the part where I call fetchName(context) in my constructor in red. It displays the following message:

Cannot access fetchName before superclass constructor has been called

我应该如何解决这个问题?

推荐答案

只能在完全构造的对象上使用成员函数.

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())
}

Although I do think that using Cursor is a bit too heavy job for constructor. I'd use separate Factory like so:

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)
        }
    }
}

进一步阅读:

Kotlin相关问答推荐

只能在元素区域中点击的Jetpack Compose列

Kotlin Coroutine()是如何工作的?S阻止了.

数据源配置

如何在操作系统版本上正确获取Room数据库的路径>;=26 sdk?

为什么这两个 Kotlin 协程函数不一样?

区分函数和扩展

Jetpack Compose:当状态从另一个活动改变时强制重组

如何通过 compose 处理剪切区域?

listOf() 返回 MutableList

interface扩展

Kotlin 中的部分类委托

Gradle 同步失败:不支持的方法:KotlinPlatformContainer.supports()

Kotlin默认使用哪种排序?

如何捕获传递给模拟函数的参数并返回它?

(kotlin的Moshi)@Json vs@field:Json

未解决的参考 dagger 2 + kotlin + android gradle

uses-sdk:minSdkVersion 16 不能小于库中声明的版本 23

在Kotlin中创建通用二维数组

函数引用和lambdas

Dagger 2 androidx fragment不兼容类型