В чем проблема?
fun calculateAvgSpeed(distance: Int, time: Int) { … }
fun main() {
val weight = 64 // kg
val time = 60 // sec
calculateAvgSpeed(weight, time)
}
Скомпилируется, выполнится без проблем. Ведь Int может представлять все что угодно: время, расстояние, вес и пр. И, скажем в Java нет никакой возможности бороться с этим. В Котлин были data classes
data class Distance(val distance: Int)Которые решали эту проблему, но все же в создание они тяжелее примитивных типов: под них надо выделять место в куче, а не в стеке.
Другим вариантом были type alias
typealias Distance = Int
fun calculateAvgSpeed(distance: Distance, time: Int) { … }
но он не спасает от использования примитичного типа вместо Алиса
fun main() {
val weight = 64 // kg
val time = 60 // sec
calculateAvgSpeed(weight, time)
}
Все еще работает :(И вот теперь нам доступен value class
@JvmStaticКоторый является как бы оберткой над примитивным типом, а с другой все еще хранится в стеке, а не в куче. А это значит что Garbage Сollector не надо будет беспокоить по-мелочам.
value class Distance(val distance: Int)
@JvmStatic```
value class Distance(val distance: Int)
fun calculateAvgSpeed(distance: Distance, time: Int) { … }
fun main() {
val weight = 64 // kg
val time = 60 // sec
calculateAvgSpeed(weight, time) // does not work anymore
calculateAvgSpeed(new Distance(64), time) // works perfectly
}
таким образом можно наконец-то можно навести порядок с примитивными типами
Подробности