Kandroid代码篇 (1) 简单Logger封装

  • 简单 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,用于控制日志的输出,同时设置属性 debugsetter 访问器私有化,禁止外部设置;这样 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() 方法。“?. 知识传送门”

你可能感兴趣的:(Kandroid代码篇 (1) 简单Logger封装)