Как изменить тип возвращаемого значения для getter в Kotlin

Короткий ответ: в Kotlin тип возвращаемого значения getter задается типом свойства. Нельзя объявить свойство как Int, а из get() вернуть String. Если нужен другой тип, измените тип свойства или создайте отдельное вычисляемое свойство

Так правильно:

val priceText: String
    get() = "$price ₽"

Здесь свойство priceText имеет тип String, и getter возвращает String

Пример с ошибкой

val count: Int
    get() = "10"

Такой код не скомпилируется, потому что count объявлен как Int, а getter возвращает строку

Исправление:

val count: Int
    get() = 10

val countText: String
    get() = "10"

Можно ли не писать тип

Если Kotlin может вывести тип из getter, его можно не указывать:

val title
    get() = "Kotlin"

Но в публичном API лучше часто указывать тип явно. Так код проще читать, а изменение getter случайно не поменяет контракт свойства

Когда лучше сделать функцию

Если значение выглядит как действие или требует параметров, лучше использовать функцию

fun priceText(currency: String): String {
    return "$price $currency"
}

Свойство хорошо подходит для значения без параметров: fullName, isAdult, priceText. Функция лучше для действия: formatPrice("USD"), loadUser(), calculateTotal(discount)

Если нужно скрыть исходный тип

Иногда внутри класса хранится одно значение, а наружу нужно отдавать другое представление. Тогда делайте private-поле и публичное вычисляемое свойство:

class Product(
    private val priceCents: Int
) {
    val priceRubles: Double
        get() = priceCents / 100.0
}

Тип getter здесь не «меняется отдельно». Просто публичное свойство priceRubles сразу объявлено как Double, а внутреннее поле остается Int

Пример вычисляемого свойства

class User(
    val firstName: String,
    val lastName: String
) {
    val fullName: String
        get() = "$firstName $lastName"
}

fun main() {
    val user = User("Анна", "Иванова")
    println(user.fullName)
}

Вывод:

Анна Иванова

fullName не хранится отдельно. Оно вычисляется при обращении к getter

Частые ошибки

Ждать отдельный return type у get

В Kotlin getter не пишется как обычная функция с независимым типом. Тип принадлежит свойству

Делать тяжелую операцию в getter

Если getter ходит в сеть, читает файл или делает тяжелый расчет, читатель кода будет удивлен. Лучше сделать функцию

Использовать var без необходимости

Если значение только вычисляется и не должно задаваться извне, используйте val

Что почитать дальше по Kotlin

Если нужен общий маршрут по теме, откройте рубрику Kotlin. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x