我是Kotlin的新手,有一个共同的模式,我不确定如何最正确地应对。以下面的代码为例,该代码无法编译:
git_repo?.add().addFilepattern()
add()
是纯Java的JGit库中的调用,因此其返回类型为AddCommand!
。
我有两个选择:
git_repo?.add()!!.addFilepattern("test.txt")
和
git_repo?.add()?.addFilepattern("test.txt")
两者都能正常工作
我不知道库实现的复杂性,
JGit库的文档未指定add()
是否可以返回null,并且
在这种情况下,我通常希望add()
不返回null
用Kotlin编写哪个版本在习惯上更正确?似乎这是一个相当普遍的问题,因为基本上每个非Kotlin库都会引入此问题。
答案 0 :(得分:3)
我会使用?.
safe operator,然后在?:
Elvis operator之后添加您自己的异常。这样,您会收到一条有意义的消息。对于不了解复杂性的人来说,仅使用!!
并不是一个非常有用的信息。
val cmd = gitRepo.add()?.addFilepattern("test.txt") ?: throw IllegalStateException("assert: gitRepo.add() returned an unexpected null")
cmd.doSomething() // never is null guaranteed
如果值是每个null
,则将出现自定义错误。
断言:gitRepo.add()返回了意外的空值
在这一行之后,您将不必null
进行检查,因为可以保证表达式的结果永远不会是null
。
如果您检查另一个库的代码,并确保无论如何都永远不会null
,那么使用!!
是合适的。但是,如果不确定,请对自定义消息做一个更好的选择。
请注意,我从示例中删除了第一个?.
,因为我假设git_repo
本身不能为空。另外,我将其重命名为没有下划线,这不是正常的Kotlin命名约定。
答案 1 :(得分:1)
在这种情况下,如果您确定git_repo
将始终返回值!!
,则可以。
这很丑陋,但是!!
在您使用Java库时将始终存在,并且您无法避免。
我要使用git_repo?.add()?.addFilepattern("test.txt")
的唯一原因是,如果您要返回一个值,并且希望该值可为空,以便您的调用方法可以处理可为空。
fun nullableMethod(): string? {
return git_repo?.add()?.addFilepattern("test.txt")
}
fun callingMethod() {
if(this.nullableMethod() != null) {
}
//Else
}
如果您确信它永远不会到null
,请使用!!