TGViewer
Android Broadcast Android Broadcast @android_broadcast · 14.5K subscribers
Post #9490 6.86K
🏝 Kotlin where: Элегантное ограничение типов для чистоты и безопасности

Как часто в Android-разработке вы видели сомнительные as-приведения? 🤔

Вот пример, который недавно попался мне на глаза:

class Sample(private val activity: Activity) {

fun doSomething() {
// Опасно! Может упасть с ClassCastException,
// если activity не реализует LifecycleOwner
(activity as LifecycleOwner).lifecycle.addObserver(...)
}
}


Опустим тот факт, что здесь стоит использовать слабую ссылку (WeakReference) на Activity. Меня больше смутила необходимость вручную приводить Activity к LifecycleOwner.

Да, в современной Android-разработке AppCompatActivity и FragmentActivity реализуют этот интерфейс. Но наша цель — писать чистый и стабильный код, который не полагается на слепую веру, а гарантирует безопасность на уровне типов.

💡Решение: Ограничение типов с помощью where

В Kotlin мы можем использовать условие where для универсальных параметров, чтобы указать: «класс A должен быть одновременно и Activity, и LifecycleOwner

class Sample<A>(private val activity: A)
where A : Activity,
A : LifecycleOwner {

fun doSomething() {
// Теперь activity можно использовать как LifecycleOwner
// БЕЗОПАСНО и без приведения типов
activity.lifecycle.addObserver(...)
}
}


Этот же подход отлично работает и для функций:

fun <A> doSomethingWith(activity: A)
where A : Activity,
A : LifecycleOwner {
// Полная типобезопасность
activity.lifecycle.addObserver(...)
}


В чем выигрыш?

Безопасность: Компилятор гарантирует, что в класс Sample или функцию doSomethingWith можно передать только объект, который удовлетворяет обоим условиям:
1️⃣Исключаются ошибки ClassCastException в рантайме.
2️⃣Чистота кода: Исчезают громоздкие и опасные приведения через as.
3️⃣ Выразительность: Сигнатура класса/функции явно сообщает о своих требованиях к переданным зависимостям.

Используйте силу системы типов Kotlin на полную! Это делает код не только чище, но и стабильнее. 💪

#kotlin #android #androiddev
  • 👍 163
  • 🔥 36
  • ❤ 22
More from @android_broadcast
  1. Sep 30, 2026📹 День, когда сайдлоадинг остановился. Google запустила верификацию разработчиков при уст…
  2. Sep 30, 2026‼️NoOp — удобный способ отключить API в релизных сборках без усложнения кода Отладочные ин…
  3. Sep 30, 2026🛒 Google Play расширяет возможности и типы платных подписок В блоге Android Developers ра…
  4. Sep 29, 2026🤖 Обновленный гайд по поиску лагов UI в Android Показано как искать проблемы на версиях A…
  5. Sep 28, 2026🤖 Google прокачала Wi-Fi дебаг в Android 17 и вот как Google выкатил ADB Wi-Fi 2.0 в Andr…
  6. Sep 27, 2026🤖 Android Dev Summit возвращается! Конференция от Google про Android для разработчиков сн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →