Kotlin作业不是表达。强制启用断言的任何其他方法?

时间:2018-05-10 13:30:39

标签: kotlin

我目前正在学习Kotlin,我正在做的一种方法是自动将Java代码转换为Kotlin并研究结果。我尝试转换的一段Java代码是类中的以下静态块,它试图确保启用断言:

static {
    boolean assertsEnabled = false;
    assert assertsEnabled = true;
    if (!assertsEnabled)
        throw new AssertionError("Please enable assertions!");
}

这依赖于assertsEnabled = true表达式作为assert的参数。在Java中,赋值是表达式。在Kotlin,他们不是,因此无法转换。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,Kotlin没有assert关键字及其特殊语义。相反它有这个功能:

inline fun assert(value: Boolean, lazyMessage: () -> Any)

您可以看到作为第一个参数传递的表达式是无条件计算的。这意味着您无法实现与Java相同的轻量级检查;你必须触发一个实际的断言失败才能确定。

因此,您需要按@Zoe

的建议进行检查
try {
    assert(false)
    throw IllegalStateException("Please enable assertions!")
} catch (e: AssertionError) {
    // Things are looking good; carry on
}

如果您坚持抛出AssertionError而不是IllegalStateException,则可以使用布尔变量。

var assertionsAreDisabled = false
try {
    assert(false)
    assertionsAreDisabled = true
} catch (e: AssertionError) {
    // Things are looking good; carry on
}
if (assertionsAreDisabled) {
    throw AssertionError("Please enable assertions!")
}