При работе с библиотеками Java в Kotlin, это более идиоматично для использования?или же !!на метод возвращаемых значений? - PullRequest
0 голосов
/ 16 декабря 2018

Я новичок в Kotlin, и есть общая закономерность, с которой я не уверен, как поступить наиболее правильно.Возьмем, к примеру, этот код, который не компилируется:

git_repo?.add().addFilepattern()

add() - это вызов в библиотеке JGit, который является чисто Java, поэтому его тип возвращаемого значения AddCommand!.

У меня есть два варианта:

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

и

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

Оба работают нормально, учитывая, что

  1. Я не знаютонкости реализации библиотеки,

  2. документация библиотеки JGit не указывает, может ли add() вернуть ноль, а

  3. в пределахв этом контексте я бы обычно ожидал, что add() не вернет ноль

Какая версия более идиоматически правильна для записи в Kotlin?Похоже, что это было бы довольно распространенной проблемой для решения, так как в основном каждая некотлинская библиотека могла бы представить эту проблему.

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Я бы использовал ?. безопасный оператор , а затем поместил бы свое собственное исключение в конце после ?: оператора Элвиса .Таким образом, вы получите сообщение, которое имеет смысл.Использование только !! не очень полезно для тех, кто не знает, в чем заключались тонкости.

val cmd = gitRepo.add()?.addFilepattern("test.txt") ?: throw IllegalStateException("assert: gitRepo.add() returned an unexpected null")
cmd.doSomething() // never is null guaranteed

Если значение равно null, у вас будет пользовательская ошибка.

assert: gitRepo.add () вернул неожиданный нуль

И после этой строки вам не нужно будет null проверять, так как результат выражениягарантированно никогда не будет null.

Если вы проверяете код другой библиотеки и убедитесь, что он никогда не будет null, несмотря ни на что, тогда !! подходит.Но если вы не уверены, сделайте одно лучше с пользовательским сообщением.

Примечание. Я исключил первый ?. из вашего примера, потому что я предполагаю, что git_repo само по себе не может быть пустым.Кроме того, я переименовал его, чтобы не было подчеркивания, которое не является нормальным соглашением по именам Kotlin.

0 голосов
/ 16 декабря 2018

Если вы уверены, что 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, используйте !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...