Освой Kotlin играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Value Classes

Если у класса указать ключевое слово value, то будет создан класс с заданным типом. Это позволит избежать некоторых ошибок, которые может пропустить компилятор.

Допустим, мы создадим функцию показа веса кота и передадим ей два разных значения.


private fun showCatWeight(weight: Double) {
    println("Cat's weight: $weight")
}

button.setOnClickListener {
    val murzikWeight = 5.0  // вес кота в кг
    val murzikLength = 70.0 // длина кота в см
    showCatWeight(murzikWeight)
    showCatWeight(murzikLength)
}

Мы создали две переменные для хранения данных о весе и длине кота и передали ей функции. Функция спокойно обработала обе переменные, хотя мы знаем, что вес нельзя измерять в сантиметрах.

Чтобы избежать подобных ситуаций, в Kotlon 1.5 появились новые классы Value Classes. Вам нужно создать новый класс с ключевым словом value и аннотацией @JvmInline.


@JvmInline
value class DisplayCatWeight(val value: Double)

Перепишем пример.


private fun showCatWeight(weight: DisplayCatWeight) {
    println("Cat's weight: $weight")
}

button.setOnClickListener {
    val murzikWeight = DisplayCatWeight(5.0)
    showCatWeight(murzikWeight)
}

Теперь вы не сможете использовать любые значения типа Double, вам придётся явно создать объект нужного класса.

Использование нового типа класса не оказывает сильной нагрузки на ресурсы, класс достаточно легковесный. Его использование оправдано в простейших ситуациях. В больше сложных примерах возможно лучше использовать data class или typealias.

Реклама