Kotlin 'when' - Как получить предупреждение о задержке в Android Studio - PullRequest
1 голос
/ 03 июня 2019

Итак, в моем приложении много Enums, которые используются в kotlins , когда вызывает.

Например, мой класс enum

enum class MyFancyEnum {
  TYPE_A,TYPE_B, TYPE_C
}

используется примерно такэто:

when (it){
 TYPE_A -> { ... }
}

Мне нужно предупреждение (или, что еще лучше, ошибка) на случай, если я забыл различать все ветви.

Я вижу, компилятор выделяет этоуже и, перемещая курсор на него, я получаю сообщение, подобное этому:

'когда' выражение в enum рекомендуется быть исчерпывающим, вместо этого добавьте ветвь '...' или ветвь 'else'

Однако в Android Studio для этого не проверяется ворс.(Кажется, это случай переключения для Java, но ничего похожего на Kotlin).

Вопрос: Как получить предупреждение / ошибку Lint в случае, если я забыл одну ветвь в выражении when?

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Это обходной путь, который был предложен в комментариях: добавьте пустой оператор .also{} в конец выражения when.

 when (it){
     TYPE_A -> { ... }
 }.also{}

В этом приеме используется сам компилятор Kotlin, который требует, чтобы все ветви when были покрыты, если кто-то использует результат выражения when() { .. }. Поскольку .also{} технически использует результат when, это вызывает ошибку компилятора.

0 голосов
/ 03 июня 2019

Вы можете достичь этого, используя запечатанные классы .

Вы можете перевести ваше перечисление в запечатанный класс и использовать его следующим образом:

sealed class MyFancyEnum {
   object TYPE_A : MyFancyEnum()
   object TYPE_B : MyFancyEnum()
   object TYPE_C : MyFancyEnum()
}

fun setFancyEnum(fancyEnum: MyFancyEnum) {
   when(fancyEnum) {
     is MyFancyEnum.TYPE_A -> ...
     is MyFancyEnum.TYPE_B -> ...    
  }
}

В этомВ этом случае он даже не скомпилируется, потому что не все опции закрытого класса обрабатываются.

...