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

我使用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)强调了在我的constructor以红色调用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()) } 

尽管我确实认为使用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) } } } 

进一步阅读:

  • 在构造函数中做了很多坏事?
  • 为什么从构造函数中调用方法被认为是不好的做法?