snrostov
10/02/2017, 10:15 AMkotlin
const val paranoic = false;
inline fun checkParanoic(condition: Boolean) {
if (paranoic && !condition) error(...)
}
inline fun main() {
...
checkParanoic(false);
...
}
Чтобы отключить проверки достаточно установить значение константы, и тогда проверки не будет даже в сборке (может быть полезно там где размер jar-ника важен, например для андроида).
Второе более маниакальное приминение: частичное выполнение с известными константами. Например описание классов через рефлексию можно считать константой, тогда, например, код по сериализации компилятор сможет оптимизировать для каждого конкретного типа.
Пример:
kotlin
data class User(name: String, sername: String)
inline fun <reified T> serialize(obj: T, output: JsonWriter) {
T::class.properties.forEach {
output.beginObject()
output.key(it.name).value(it.getValue(obj))
output.endObject()
}
}
fun main() {
serialize(MyUser("ivan", "ivanov"), JsonWriter(...))
}
Могло бы скомпилироваться в:
kotlin
data class User(name: String, sername: String)
fun main() {
val obj = MyUser("ivan", "ivanov")
val output = JsonWriter(...)
output.beginObject()
output.key("name").value(obj.name)
output.key("sername").value(obj.sername)
output.endObject()
}
Что может быть на порядок быстрее чем вытаскивать значение каждого поля через рефлексию.