代码之家  ›  专栏  ›  技术社区  ›  DodgyCodeException

Kotlin赋值不是表达式。有没有其他方法可以强制启用断言?

  •  0
  • DodgyCodeException  · 技术社区  · 6 年前

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

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

    这取决于 assertsEnabled = true 表达式作为的参数 assert .在Java中,赋值是表达式。在科特林,它们不是,所以这不能被转换。还有其他方法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Marko Topolnik    6 年前

    不幸的是,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!")
    }