在Kotlin数据类

时间:2016-07-20 12:20:01

标签: 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;
    }

}

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:9)

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

Vertex

虽然我确实认为使用package main import ( "fmt" "math" ) type Vertex struct { X, Y float64 } func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X + v.Y*v.Y) } func (v *Vertex) Scale(f float64) { v.X = v.X * f v.Y = v.Y * f } func main() { v := Vertex{3, 4} v.Scale(10) fmt.Println(v.Abs()) } 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()) } 来说有点太重了。我这样使用单独的Factory

Cursor

进一步阅读:

答案 1 :(得分:0)

另一种方法是使用伴随对象。这将允许您调用该函数 数据类之外(在您的特定情况下可能没有用)

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