Функция доступа перед вызовом конструктора суперкласса в классе данных Kotlin

Я использую классы данных в Kotlin, чтобы значительно уменьшить количество Java-кода, который в противном случае мне пришлось бы писать.

Однако в одном из моих классов Java я не уверен, что делать, чтобы добиться того же результата в Котлине.

Мой класс 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; } } 

Я попытался переписать его в Котлин, и до сих пор у меня это:

 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 перед 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) } } } 

Дальнейшее чтение:

  • Делает много в конструкторах плохо?
  • Почему считается неправильной практикой вызывать метод из конструктора?