[Перевод] Классы значения в Kotlin: прощайте псевдонимы типов?
С выходом Kotlin 1.5.0, классы значения (известные ранее как inline классы) наконец-таки стабильны и были освобождены от аннотации
@OptIn
. Было много нового в релизе, что также создало много путаницы, так как теперь нам доступны три очень похожих инструмента: псевдонимы типов, классы данных и классы значения. Так какой же нам использовать теперь? Можно ли выбросить сразу псевдонимы типов и data-классы и заменить их на value-классы?
Проблема
Классы в Kotlin решают две проблемы:
Они передают смысл через их название и облегчают понимание, что за объект передается.
Они принуждают к типобезопасности утверждая, что объект класса А не может быть передан функции, которая ожидает объект класса Б входным параметром. Это предотвращает серьезные ошибки еще во время компиляции.
Примитивные типы такие как Int
, Boolean
, Double
также принуждают к типобезопасности (нельзя передать Double
туда, где ожидается Boolean
), но они не передают смысл (ну кроме того, что это число).
Double
числом может быть практически что угодно: температура в градусах Цельсия, вес в килограммах или уровень яркости вашего экрана в процентах. Все что понятно это только то, что мы имеем дело с числом с плавающей запятой двойной точности (64 бит), но это не говорит нам о том, что это число собой представляет. По этой причине, семантическая типобезопасность нарушена:
Если у нас есть функция для установки уровня яркости нашего дисплея:
fun setDisplayBrightness(newDisplayBrightness: Double) { ... }
мы можем вызвать эту функцию с любым Double
значением и можем случайно передать число с совершенно другим смыслом:
val weight: Double = 85.4
setDisplayBrightness(weight) //