我在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
我该如何解决这个问题?
答案 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
}
}
}