- 簡單 Logger 封裝需求
- kotlin 封裝實(shí)現(xiàn)
- kotlin 相關(guān)知識(shí)點(diǎn)
一浊伙、簡單 Logger 封裝需求
??本需求是一個(gè)簡單的 Logger
需求爽醋,旨在簡單的控制 Logger
日志的耻蛇,輸出時(shí)間纤子、及輸出 tag
動(dòng)態(tài)更新。需求如下:
代碼控制
Logger
日志輸出睡蟋,默認(rèn)不輸出日志踏幻;日志輸出時(shí)可以指定日志的
tag
標(biāo)簽,當(dāng)不指定時(shí)默認(rèn)為項(xiàng)目名稱戳杀;符合 Android 系統(tǒng)
Log
調(diào)用習(xí)慣该面。
二、kotlin 封裝實(shí)現(xiàn)
- 需求實(shí)現(xiàn)信卡,使用 Kotlin 實(shí)現(xiàn)對(duì)
Logger
日志功能隔缀,并支持 Java 的對(duì)應(yīng)調(diào)用。
class OkLogger {
companion object { // 1??
private const val DEF_TAG = "okLogger"
// 伴生屬性傍菇,相當(dāng)于Java的靜態(tài)類成員變量
var debug: Boolean = false // 2??
private set
var tag: String = this.DEF_TAG
private set
private fun isPrint(message: String) = debug && !TextUtils.isEmpty(message)
@JvmOverloads // 3??
@JvmStatic // 4??
fun setLogger(enable: Boolean = true, tag: String = DEF_TAG) { // 5??
this.tag = tag
this.debug = enable
}
@JvmOverloads
@JvmStatic
fun v(message: String, tag: String = this.tag) {
if (isPrint(message)) Log.v(tag, message)
}
@JvmOverloads
@JvmStatic
fun d(message: String, tag: String = this.tag) {
if (isPrint(message)) Log.d(tag, message)
}
@JvmOverloads
@JvmStatic
fun i(message: String, tag: String = this.tag) {
if (isPrint(message)) Log.i(tag, message)
}
@JvmOverloads
@JvmStatic
fun w(message: String, tag: String = this.tag) {
if (isPrint(message)) Log.w(tag, message)
}
@JvmOverloads
@JvmStatic
fun e(message: String, tag: String = this.tag) {
if (isPrint(message)) Log.e(tag, message)
}
@JvmStatic
fun printStackTrace(throwable: Throwable?) {
if (debug) {
throwable?.printStackTrace() // 6??
}
}
}
}
- Kotlin 語言掉用
OkLogger
開啟并輸出日志猾瘸。
OkLogger.setLogger(tag = "RabbitPrj")
OkLogger.d("message: onCreate is done.")
OkLogger.v("message warning: onCreate is done.", "warning")
// 輸出日志
cn.rabbit.example D/RabbitPrj: message: onCreate is done.
cn.rabbit.example V/warning: message warning: onCreate is done.
- Java 語言調(diào)用
OkLogger
開啟并輸出日志。
OkLogger.setLogger(true, "RabbitPrj");
OkLogger.d("message: onCreate is done.");
OkLogger.v("message warning: onCreate is done.", "warning");
// 輸出日志
cn.rabbit.example D/RabbitPrj: message: onCreate is done.
cn.rabbit.example V/warning: message warning: onCreate is done.
三丢习、kotlin 相關(guān)知識(shí)點(diǎn)
上述代碼第1??行使用
OkLogger
的伴生對(duì)象實(shí)現(xiàn)日志的輸出功能牵触,是考慮在 Java 中也可以簡單的調(diào)用,像使用系統(tǒng)的Log
一樣簡單泛领;Kotlin 的伴生對(duì)象中定義的屬性荒吏、及函數(shù),相當(dāng)于 Java 中類的 靜態(tài)成員變量 和 靜態(tài)方法渊鞋。“伴生對(duì)象知識(shí)傳輸門”代碼第2??行绰更,在
OkLogger
的伴生對(duì)象中定義了一個(gè)屬性debug
瞧挤,用于控制日志的輸出,同時(shí)設(shè)置屬性debug
的setter
訪問器私有化儡湾,禁止外部設(shè)置特恬;這樣 Java 中debug
屬性對(duì)應(yīng)的方法getDebug()
是公有的,而對(duì)應(yīng)的setDebug()
是私有的徐钠。代碼第3??行添加
@JvmOverloads
注解后癌刽,JVM 編譯器會(huì)生成對(duì)個(gè)版本的setLogger
方法提供給 Java 調(diào)用,因?yàn)?Java 中不能給方法參數(shù)設(shè)置默認(rèn)值尝丐。這也是 Kotlin 和 Java 中思想不同點(diǎn)之一显拜,在編寫 kotlin 代碼時(shí),使用重載的地方要盡量使用 默認(rèn)參數(shù) 思想替換爹袁。“@JvmOverloads相關(guān)知識(shí)傳送門”代碼第4??行添加
@JvmStatic
注解后远荠,在 Java 中可以通過OkLogger. setLogger()
(類名.函數(shù)名) 來調(diào)用。“@JvmStatic相關(guān)知識(shí)傳送門”代碼第5??行失息,通過設(shè)置默認(rèn)參數(shù)的思想譬淳,達(dá)到函數(shù)重載的目的。
代碼第6??行
throwable?.printStackTrace()
盹兢,只有當(dāng)throwable
不為null
時(shí)才會(huì)執(zhí)行后面的printStackTrace()
方法邻梆。“?. 知識(shí)傳送門”