最近開始學(xué)習(xí)kotlin,這里根據(jù)kotlin擴(kuò)展類的特性,寫了一個(gè)簡單的日志管理的類
這里涉及到一些kotlin和java不同的屬性启绰,做以下一些簡單的解釋:
1、inline: 內(nèi)聯(lián)函數(shù)沟使,是私有類型函數(shù)委可,能節(jié)省一些內(nèi)存開銷,下文會接著介紹到inline函數(shù)
2格带、reified: 這個(gè)方法的意思是撤缴,具體化一個(gè) T 的類型參數(shù),必須以 inline內(nèi)聯(lián)方式聲明這個(gè) 方法才有效。
3叽唱、T::class.simpleName:返回一個(gè)T::class.simpleName 中的simpleName
4屈呕、kotlin: if-else自動返回最后一行
5妥曲、這里要注意下下面,這里用到了反射,但kotlin要使用反射要加入一個(gè)依賴庫:
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
否則會拋出這個(gè)異常:
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
}
我們調(diào)用是就只要這樣寫就行了:
//其它的同理調(diào)用
log_i<MainActivity>("")
inline函數(shù)
上面提到inline(內(nèi)聯(lián)函數(shù))函數(shù)能節(jié)省內(nèi)存開銷祷安, 我們先看調(diào)用log_i反編譯,看看發(fā)生了什么:
如果不加inline函數(shù)镶摘,反編譯是這樣的:
inline函數(shù)就是把代碼整體給拿過來用了嗽桩,而不是通過對象來掉用這個(gè)方法,這樣就應(yīng)該能很明顯的感覺到inline函數(shù)的優(yōu)勢了