在Kotlin中使用Java库时,使用起来更惯用吗?要么 !!方法返回值?

时间:2018-12-16 03:10:57

标签: kotlin

我是Kotlin的新手,有一个共同的模式,我不确定如何最正确地应对。以下面的代码为例,该代码无法编译:

git_repo?.add().addFilepattern()

add()是纯Java的JGit库中的调用,因此其返回类型为AddCommand!

我有两个选择:

git_repo?.add()!!.addFilepattern("test.txt")

git_repo?.add()?.addFilepattern("test.txt")

两者都能正常工作

  1. 我不知道库实现的复杂性,

  2. JGit库的文档未指定add()是否可以返回null,并且

  3. 在这种情况下,我通常希望add()不返回null

用Kotlin编写哪个版本在习惯上更正确?似乎这是一个相当普遍的问题,因为基本上每个非Kotlin库都会引入此问题。

2 个答案:

答案 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,请使用!!