почему переменные инициализируются в классе данных - PullRequest
0 голосов
/ 18 июня 2020

Согласно официальному документу do c, это способ объявить data class

data class User(val name: String, val age: Int) 

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

data class User(var username: String? = "", var email: String? = "", var age: Int = 0)

объяснение из документации: на JVM, если сгенерированный класс должен иметь конструктор без параметров, должны быть указаны значения по умолчанию для всех свойств

я не понимаю, и каковы последствия различных методов

во-вторых, как лучше всего записать класс данных, содержащий сложные объектные переменные, такие как, ArrayList, Bitmap, Uri

1 Ответ

3 голосов
/ 18 июня 2020

Конструктор без параметров, вероятно, понадобится только в том случае, если вы использовали класс с какой-либо библиотекой, которая генерирует экземпляры вашего класса посредством отражения, например библиотеку сериализации или библиотеку внедрения зависимостей. * и некоторое значение после параметра конструктора, это позволяет вам опустить этот параметр при вызове конструктора. Введенное вами значение будет значением по умолчанию, если параметр не указан. Обычно это используется для удобства. Но если вы используете одну из вышеупомянутых библиотек, вам также понадобится пустой конструктор. Указав значения по умолчанию для каждого параметра и пометив основной конструктор с помощью @JvmOverloads, вы можете удовлетворить это требование. Это будет выглядеть так:

data class User @JvmOverloads constructor(var username: String? = "", var email: String? = "", var age: Int = 0)

Если ваш класс данных имеет много свойств, вы можете не захотеть использовать @JvmOverloads, потому что количество конструкторов, которые он генерирует, экспоненциально пропорционально количеству свойств с по умолчанию. Вместо этого вы можете определить вторичный конструктор следующим образом:

data class User(var username: String?, var email: String?, var age: Int) {
    constructor(): this("", "", 0)
}

Ваш второй вопрос очень открытый и основан на мнении, поэтому на него практически невозможно дать полезный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...