初学kotlin,写一个简单的logutils日志类
2017-08-08 本文已影响215人
荒诞的墨墨
最近开始学习kotlin,这里根据kotlin扩展类的特性,写了一个简单的日志管理的类
这里涉及到一些kotlin和java不同的属性,做以下一些简单的解释:
1、inline: 内联函数,是私有类型函数,能节省一些内存开销,下文会接着介绍到inline函数
2、reified: 这个方法的意思是,具体化一个 T 的类型参数,必须以 inline内联方式声明这个 方法才有效。
3、T::class.simpleName:返回一个T::class.simpleName 中的simpleName
4、kotlin: if-else自动返回最后一行
5、这里要注意下,这里用到了反射,但kotlin要使用反射要加入一个依赖库:
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
否则会抛出这个异常:
KotlinReflectionNotSupportedError
日志类
/**
* Created by anymo on 2017/8/7.
*/
val logSwitch = true
inline fun <reified T> log_i(log: Any): String {
val resultI = if (logSwitch) {
Log.i(T::class.simpleName, log.toString())
"OK"
} else {
"fail"
}
return resultI
}
inline fun <reified T> log_d(log: Any): String {
val resultD = if (logSwitch) {
Log.d(T::class.simpleName, log.toString())
"OK"
} else {
"fail"
}
return resultD
}
inline fun <reified T> log_w(log: Any): String {
val resultW = if (logSwitch) {
Log.w(T::class.simpleName, log.toString())
"OK"
} else {
"fail"
}
return resultW
}
inline fun <reified T> log_e(log: Any): String {
val resultE = if (logSwitch) {
Log.e(T::class.simpleName, log.toString())
"OK"
} else {
"fail"
}
return resultE
}
我们调用是就只要这样写就行了:
//其它的同理调用
log_i<MainActivity>("")
inline函数
上面提到inline(内联函数)函数能节省内存开销, 我们先看调用log_i反编译,看看发生了什么:
log_i反编译.png如果不加inline函数,反编译是这样的:
反编译不带inline函数.pnginline函数就是把代码整体给拿过来用了,而不是通过对象来掉用这个方法,这样就应该能很明显的感觉到inline函数的优势了