Я знаю, что класс данных похож на простые модели в kotlin с геттерами и установщиком по умолчанию и так же прост:
data class User(val name: String, val age: Int)
Можно ли объявить второй конструктор для этого класса данных?
Я знаю, что класс данных похож на простые модели в kotlin с геттерами и установщиком по умолчанию и так же прост:
data class User(val name: String, val age: Int)
Можно ли объявить второй конструктор для этого класса данных?
Вы можете установить класс данных следующим образом
data class User(val name: String? = null, val id: String? = null, val email: String? = null)
и вы можете создать экземпляр объекта с несколькими конструкторами, как этот
val userId = User(id = "123456")
val userMail = User(email= "[email protected]")
val userName = User("Name")
Да, но каждая переменная должна быть инициализирована, поэтому вы можете задать аргументы по умолчанию в своем конструкторе класса данных, например:
data class Person(val age: Int, val name: String = "Person without name")
Теперь вы можете создать экземпляр этого класса данных двумя способами.
Person(30)
Person(20, "Bob")
Класс данных Kotlin должен иметь первичный конструктор, который определяет хотя бы один элемент. Помимо этого, вы можете добавить вторичные конструкторы, как описано в Классы и Наследование - Вторичные конструкторы.
Для вашего класса и пример вторичного конструктора:
data class User(val name: String, val age: Int) {
constructor(name: String): this(name, -1) { ... }
}
Обратите внимание, что вторичный конструктор должен делегировать основному конструктору его определение.
Хотя многие вещи, общие для вторичных конструкторов, могут быть решены с использованием значений по умолчанию для параметров. В приведенном выше примере вы можете упростить:
data class User(val name: String, val age: Int = -1)
Если вы вызываете их из Java, вы должны прочитать Java interop - Java, который вызывается в документации Kotlin о том, как создавать перегрузки, а может быть, иногда NoArg Compiler Plugin для других особых случаев.
Обновленный ответ для классов данных:
Да, вы можете, но вам нужно делегировать все в основной конструктор
data class User(val name: String, val age: Int)
{
constructor(name: String): this(name, -1) {
}
constructor(age: Int): this("Anon", age) {
}
}
// Anon name: Anon
println("Anon name: " + User(30).name)
// No age: -1
println("No age: " + User("Name").age)
// Name: Name age: 20
val u = User("Name", 20)
println("Name: " + u.name + " age: " + u.age)
Вы также можете установить значения по умолчанию в своем основном конструкторе, как это сделал Алексей.
Да, мы можем использовать, как ниже, код, а в первичном конструкторе для класса данных должен иметь мин один параметр.
data class SampleData(val name: String, val age: Int) {
constructor(name: String, age: Int, email: String) : this(name, age) {
}
}
Значения по умолчанию в первичном конструкторе устраняют многие потребности во вторичных конструкторах, но если необходимый экземпляр зависит от логики, основанной на данных, которые должны быть проанализированы, лучшим решением может быть использование сопутствующего объекта.
data class KeyTag(val a: String, val b: Int, val c: Double) {
companion object Factory {
val empty = KeyTag("", 0, 0.0)
fun create(bigString: String): KeyTag {
// Logic to extract appropriate values for arguments a, b, c
return KeyTag(a, b, c)
}
fun bake(i: Int): KeyTag = KeyTag("$i", i, i.toDouble())
}
}
Использование тогда:
val ks = KeyTag.create("abc:1:10.0")
val ke = KeyTag.empty
val kb = KeyTag.bake(2)
Класс данных обеспечит согласованность и содержательное поведение, также нам нужно иметь val для неизменности.
data class SampleData(val name: String, val age: Int, val email: String ?= null) {
constructor(name: String, age: Int) : this(name, age, null) {
}
}
вторичный конструктор должен делегировать основному конструктору его определение, поэтому для поддержания неизменности будет иметь значение "null".
Указывает компилятору Kotlin генерировать перегрузки для этой функции, которые заменяют значения параметров по умолчанию. Если метод имеет N параметров и M из которых имеют значения по умолчанию, генерируется M перегрузок: первый принимает N-1 параметров (все, кроме последнего, который принимает значение по умолчанию), второй принимает N-2 параметра и т.д. на.
data class User @JvmOverloads constructor(
var email: String="",
var password: String=""
)