2021-12-14 15:35:58
Еще один шаг сделал Котлин в борьбе с засилием примитивных типов.
Котлин 1.5.0 представляет
Value Classes.
В чем проблема?
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
value class Distance(val distance: Int)
Который является как бы оберткой над примитивным типом, а с другой все еще хранится в стеке, а не в куче. А это значит что Garbage Сollector не надо будет беспокоить по-мелочам.
@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
}
```
таким образом можно наконец-то можно навести порядок с примитивными типами
Подробности
440 views12:35