是否有一个java内置函数等价于kotlin的require函数?

v1uwarro  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(363)

kotlin有一个require函数,可以这样使用(从参考文档中复制):

fun getIndices(count: Int): List<Int> {
    require(count >= 0) { "Count must be non-negative, was $count" }
    // ...
    return List(count) { it + 1 }
}

// getIndices(-1) // will fail with IllegalArgumentException

println(getIndices(3)) // [1, 2, 3]

如果值为false,则函数本质上抛出illegalargumentexception。显然,这可以很容易地用java实现——但我想知道,jdk或apache库(或任何其他普遍存在的库)中是否已经有了提供这种功能的功能?

brc7rcf0

brc7rcf01#

public static void main(String []args){
    int count = -1;
    require(count >= 0, "Count is negative");
 }

 public static void require(Boolean predicate, String errorMessage){
     if(!predicate) throw new RuntimeException(errorMessage);
 }
vjhs03f7

vjhs03f72#

有一种方法 requireNonNull()java.util.Objects 获取一个对象引用并检查它是否存在 null .
看看这里的javadoc!
但很明显,这不如kotlin版本灵活…

qf9go6mv

qf9go6mv3#

你可以用 assert 等价于kotlin的函数 require 方法。

assert count >= 0 : "Count must be non-negative, was " + count;

用Assert编程
jdk默认情况下禁用Assert操作。如果要启用Assert操作,则必须使用如下vm选项定义已启用的包或类位置 -ea:com.example.demo... 启用和禁用Assert
我更喜欢Spring框架 org.springframework.util.Assert 类,因为有很多方法用于验证参数。
更简单的方法:

Assert.isTrue(count >= 0, "Count must be non-negative, was " + count);

懒惰的方式(为了更好的性能和像kotlin一样的流) require 功能):

Assert.isTrue(count >= 0, () -> "Count must be non-negative, was " + count);

springAssert语句
对于单元测试,可以使用junit( org.junit.Assert )或者木星( org.junit.jupiter.api.Assertions )Assert函数。

gc0ot86w

gc0ot86w4#

public class TestAsserts {
    public static void main(String[] argv) {

        int count = -2;

        testCount(count);
    }

    public static void testCount(int count) {
        assert(count >= 0): "Count must be non-negative, was " + count;
    }
}

也一样。您可以决定在运行时是否启用Assert。要运行这个你需要通过 -ea 作为java命令行选项。
请注意,例外情况也有点不同:

Exception in thread "main" java.lang.AssertionError: Count must be non-negative, was -2
    at TestAsserts.testCount(TestAsserts.java:12)
    at TestAsserts.main(TestAsserts.java:8)
bnlyeluc

bnlyeluc5#

由于java1.4,jdk中有assert关键字,可以用来做类似的事情。在这种情况下,会抛出asserrionerror。

相关问题