когда исчерпывающе, а иначе избыточно? - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в kotlin, и я создал метод, который содержит инструкцию when и IntelliJ, предлагая мне удалить ветку else. Я не совсем уверен, почему. Есть идеи, почему мне нужно удалить ветку else здесь? Это код:

    companion object{
    @Synchronized fun getDriver(
        url: String,
        desiredCapabilities: DesiredCapabilities,
        mobilePlatform: MobilePlatform)
        : AppiumDriver<WebElement> =
        when(mobilePlatform){
            MobilePlatform.ANDROID -> AndroidDriver<WebElement>(URL(url), desiredCapabilities)
            MobilePlatform.IOS -> IOSDriver<WebElement>(URL(url), desiredCapabilities)
            else -> throw RuntimeException("Cannot get the driver")
        }
}

Ответы [ 3 ]

4 голосов
/ 17 февраля 2020

Когда вы исчерпали все возможные варианты, когда нет причин иметь еще ветку. Это дает дополнительное преимущество, заключающееся в том, что вы получаете ошибку компилятора после добавления элементов в перечисление, не расширяя когда.

2 голосов
/ 17 февраля 2020

В kotlin, when для объекта запечатанного класса не требуется else, если охвачены все возможные внутренние случаи.

Образец запечатанного класса :

sealed class A {
 object B: A()
 object C: A()
}

Пусть приведенный выше будет запечатанным классом, тогда любой object класса A (скажем, a) может быть использован внутри, когда он исчерпывающе (не обязательно) при возврате

return when(a) {
  is A.B -> return something
  is A.C -> return something
} // no need of else here as all cases are covered.

Здесь есть одна загвоздка, если вам просто нужно проверить одно условие, скажем, is A.B вы можете написать другое. Также обратите внимание, что вам нужно НЕ написать исчерпывающие условия / else, если это просто утверждение.

Пример ниже:

some code ...
when(a) {
      is A.B -> do some task
}
more code ...

Надеюсь, это поможет !!

0 голосов
/ 17 февраля 2020

Чтобы использовать блок else , вы можете попробовать что-то вроде:

    enum class PaymentStatus(val value: Int) {
     PAID(1),
     UNPAID(2) 
 }

    fun f(x: Int) {
    val foo = when (x) {
        PaymentStatus.PAID.value -> "PAID"
        PaymentStatus.UNPAID.value -> "UNPAID"

        else -> throw IllegalStateException()
    }
}

ИЛИ

создать фабричный метод create в companion object из enum класс:

enum class PaymentStatus(val value: Int) {
    PAID(1),
    UNPAID(2);

    companion object {
        fun create(x: Int): PaymentStatus {
            return when (x) {
                1 -> PAID
                2 -> UNPAID
                else -> throw IllegalStateException()
            }
        }
    }
}

fun f(x: Int) {
    val foo = when (PaymentStatus.create(x)) {
        PaymentStatus.PAID -> "PAID"
        PaymentStatus.UNPAID -> "UNPAID"
    }
}

Проверить здесь подробнее

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