JGSK - Kotlin - 08.Utils

Table Of Contents

Utils

本章主要介绍一些 Kotlin 内置的工具类和方法。

Preconditions

基础概念

Preconditions(前提条件)主要用于对方法中传入的参数进行基础校验。

require 和 check

require 用于检查布尔表达式是否为真。其本身接收两个参数,第一个为等待校验的布尔值,第二个为当校验不通过时显示的消息,该消息将用于构造一个 IllegalArgumentException 异常。

require(msg.isNotEmpty()) {
    "Message is empty!"
}

check 使用同 require,只是返回的为 IllegalStateException 异常。

requireNotNull 和 checkNotNull

requireNotNull 用于检查参数是否为空。其本身接收两个参数,第一个为等待校验的参数,第二个为当校验不通过时显示的消息,该消息将用于构造一个 IllegalArgumentException 异常。当校验通过后, requireNotNull 会将传入的参数作为返回值进行原样返回。

val result = requireNotNull(msg) {
    "Object is null!"
}

通用 checkNotNull 使用同 requireNotNull,只是返回的为 IllegalStateException 异常。

各种校验实现的比较

不使用前提条件时,一般的校验方式为如下形式,通过 if 语句来实现

if (msg.isEmpty()) {
    throw IllegalArgumentException("Message is empty!")
}

使用 Java 内置的断言机制

assert msg.isNotEmpty()

Google 的 Guava 包种的校验方式

Preconditions.checkArgument(msg.isNotEmpty(), "Message is empty!")

其中通过 if 语句进行校验通常需要大量重复的语句。通过断言机制的话则只能检查表达式是否为真,并且无法定义易读的错误消息,此外断言是可以被禁止的。使用 Guava 的方式在与 Kotlin 提供的方式类似,但是 Kotlin 的消息构造是惰性加载的,所以效率上要高于 Guava。

NotImplementedError

一般而言在写程序时我们通常将有待实现的方法上加上注释 // TODO 来标示该方法,但是对于调用者来说除非查看源码否则他没有办法知道这种信息。Kotlin 提供了 NotImplementedError异常用于表示这种情况。除此之外,Kotlin 还提供了一个内部方法TODO()` 用于抛出这种异常。

TODO("Not implemented in current version")

计算执行时间

Kotlin 内部提供了工具方法 measureTimeMillis() 可以用于计算代码块的耗时时间。

val duration = measureTimeMillis {
    var counter = 0
    repeat(100000000) {
        counter++
    }
}
println("duration is $duration")