Получи случайную криптовалюту за регистрацию!

Еще один шаг сделал Котлин в борьбе с засилием примитивных тип | StringConcat - разработка без боли и сожалений

Еще один шаг сделал Котлин в борьбе с засилием примитивных типов. Котлин 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
}
```

таким образом можно наконец-то можно навести порядок с примитивными типами
Подробности