#kotlin
Kotlin предлагает множество крутых фичей, которые делают написание кода проще и удобнее. reified — одна из них, и так как подобная функция есть далеко не во всех языках программирования, то многие разработчики не совсем понимают, для чего им она нужна.
💡Давайте рассмотрим пару кейсов, когда мы можем сделать наш код чище и более "Kotlin-style".
С reified непосредственно связано понятие inline функций и использование generics. При их использовании может потребоваться знание того, какого типа класс мы используем. Рассмотрим пример маппинга json в нужный нам класс:
fun <T> String.toKotlinObject(): T {
val mapper = jacksonObjectMapper()
//does not compile!
return mapper.readValue(this, T::class.java)
}Чтобы исправить ошибку при компилировании, у нас есть две опции.
1️⃣ Передавать класс в параметрах. Тогда наша функция будет выглядеть так:
fun <T: Any> String.toKotlinObject(c: KClass<T>): T {
val mapper = jacksonObjectMapper()
return mapper.readValue(this, c.java)
}А её вызов будет таким:
jsonTypeAsString.toKotlinObject(MyJsonType::class).2️⃣ Использовать reified. Тогда всё станет сильно удобнее и красивее:
inline fun <reified T: Any> String.toKotlinObject(): T {
val mapper = jacksonObjectMapper()
return mapper.readValue(this, T::class.java)
}А вызов будет таким:
json.toKotlinObject<MyJsonType>(). Как мы видим, второй вариант выглядит гораздо более удобным для использования, хотя наш пример — довольно простая функция. В более сложных кейсах это преимущество может быть ещё заметнее.
Больше подробностей о reified можно найти в этой небольшой статье. 🤓