在 Kotlin 数据 class 中调用 superclass 构造函数之前访问函数
Access function before calling superclass constructor in Kotlin data class
我在 Kotlin 中使用数据 classes 来显着减少 Java 否则我必须编写的代码量。
但是,在我的 Java classes 之一中,我不确定如何在 Kotlin 中实现相同的结果。
我的Javaclass看起来有点像这样:
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)
的部分。它显示以下消息:
Cannot access fetchName
before superclass constructor has been called
我该如何解决这个问题?
您只能在完全构造的对象上使用成员函数。
解决这个问题的一种方法是使用 private extension function 或只是一个函数来获取名称:
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)
}
}
}
进一步阅读:
- Is doing a lot in constructors bad?
- Why is it considered bad practice to call a method from within a constructor?
另一种方法是使用伴随对象。这将允许您调用该函数
在数据之外 class 以及(在您的特定情况下可能没有用)
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
}
}
}
我在 Kotlin 中使用数据 classes 来显着减少 Java 否则我必须编写的代码量。
但是,在我的 Java classes 之一中,我不确定如何在 Kotlin 中实现相同的结果。
我的Javaclass看起来有点像这样:
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)
的部分。它显示以下消息:
Cannot access
fetchName
before superclass constructor has been called
我该如何解决这个问题?
您只能在完全构造的对象上使用成员函数。 解决这个问题的一种方法是使用 private extension function 或只是一个函数来获取名称:
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)
}
}
}
进一步阅读:
- Is doing a lot in constructors bad?
- Why is it considered bad practice to call a method from within a constructor?
另一种方法是使用伴随对象。这将允许您调用该函数 在数据之外 class 以及(在您的特定情况下可能没有用)
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
}
}
}