Destructuring declarations together with non-trivial custom data classes showcase code.
Destructing custom data classes shall be done with care.
A data class:
data class CarData(
val wheels: Int,
val model: String
)
can be destructed:
fun printCar(car: CarData):String{
val (wheels, model) = car
return "wheels: $wheels " +
"- model: $model "
}
(full showcase code in branch destructDeclarationsCustomDataClasses01)
However, adding a new property (name) to the data class:
data class CarData(
val wheels: Int,
val name: String,
val model: String
)
val trabbi = CarData(4, "something","601")
can cause misleading results if the destructing code remains untouched:
fun printCar(car: CarData):String{
val (wheels, model) = car
return "wheels: $wheels " +
"- model: $model "
}
(full showcase code in branch destructDeclarationsCustomDataClasses02)
Adapting the destruction of car
fun printCar(car: CarData):String{
val (wheels, model, name) = car
return "wheels: $wheels " +
"- model: $model " +
"- name: $name "
}
improves the code
(full showcase code in branch destructDeclarationsCustomDataClasses03)
Additional ways to improve the fix are
-
data class constructor default values
data class CarData( val wheels: Int = 0, val name: String = "", // added later val model: String = "" )
-
map by name
val trabbi = CarData(wheels = 4, name = "trabbi", model = "601")
as in master branch
Run the code
./gradlew run
Run the code
./gradlew test