- 简单 Logger 封装需求
- kotlin 封装实现
- kotlin 相关知识点
一、简单 Logger 封装需求
本需求是一个简单的 Logger 需求,旨在简单的控制 Logger 日志的,输出时间、及输出 tag 动态更新。需求如下:
-
代码控制
Logger日志输出,默认不输出日志; -
日志输出时可以指定日志的
tag标签,当不指定时默认为项目名称; -
符合 Android 系统
Log调用习惯。
二、kotlin 封装实现
- 需求实现,使用 Kotlin 实现对
Logger日志功能,并支持 Java 的对应调用。
class OkLogger {
companion object { // 1️⃣
private const val DEF_TAG = "okLogger"
// 伴生属性,相当于Java的静态类成员变量
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 语言调用
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 相关知识点
-
上述代码第1️⃣行使用
OkLogger的伴生对象实现日志的输出功能,是考虑在 Java 中也可以简单的调用,像使用系统的Log一样简单;Kotlin 的伴生对象中定义的属性、及函数,相当于 Java 中类的 静态成员变量 和 静态方法。“伴生对象知识传输门” -
代码第2️⃣行,在
OkLogger的伴生对象中定义了一个属性debug,用于控制日志的输出,同时设置属性debug的setter访问器私有化,禁止外部设置;这样 Java 中debug属性对应的方法getDebug()是公有的,而对应的setDebug()是私有的。 -
代码第3️⃣行添加
@JvmOverloads注解后,JVM 编译器会生成对个版本的setLogger方法提供给 Java 调用,因为 Java 中不能给方法参数设置默认值。这也是 Kotlin 和 Java 中思想不同点之一,在编写 kotlin 代码时,使用重载的地方要尽量使用 默认参数 思想替换。“@JvmOverloads相关知识传送门” -
代码第4️⃣行添加
@JvmStatic注解后,在 Java 中可以通过OkLogger. setLogger()(类名.函数名) 来调用。“@JvmStatic相关知识传送门” -
代码第5️⃣行,通过设置默认参数的思想,达到函数重载的目的。
-
代码第6️⃣行
throwable?.printStackTrace(),只有当throwable不为null时才会执行后面的printStackTrace()方法。“?. 知识传送门”







网友评论