初学kotlin,写一个简单的logutils日志类

作者: 荒诞的墨墨 | 来源:发表于2017-08-08 16:28 被阅读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函数.png

    inline函数就是把代码整体给拿过来用了,而不是通过对象来掉用这个方法,这样就应该能很明显的感觉到inline函数的优势了

    相关文章

      网友评论

      本文标题:初学kotlin,写一个简单的logutils日志类

      本文链接:https://www.haomeiwen.com/subject/ahitrxtx.html