Использование предложения kotlin с перечислениями вместо множественных, если - PullRequest
0 голосов
/ 28 января 2019

Я работаю со следующим кодом:

  override fun presentNativeItem(dcsItem: DCSItem?): Any {
        if (dcsItem?.type == "NavMenu") {
            return buildNavMenu(dcsItem)
        } else if (dcsItem?.type == "NavLink") {
            return buildNavLink(dcsItem)
        } else if (dcsItem?.type == "Image") {
            return buildImage(dcsItem)
        }
        else throw IllegalStateException("Unknown Type ${dcsItem?.type} of NavItem")
    }

Но вместо использования множественного if я хотел бы использовать следующее перечисление:

enum class DSCType {
    NAVMENU,
    NAVLINK,
    IMAGE;

    override fun toString(): String {
        return this.name.toLowerCase()
    }

    companion object {
        fun fromString(value: String?): DSCType? {
            return when (value?.toLowerCase()) {
                "NavMenu" -> NAVMENU
                "NavLink" -> NAVLINK
                "Image" -> IMAGE
                else -> null
            }
        }
    }
}

Любые идеи о том, как можноЯ достигаю этого по-котлински?

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 января 2019

попробуйте это:

fun presentNativeItem(dcsItem: DCSItem?): Any {
    return enumValues<DSCType>().firstOrNull { dcsItem?.type == it.typeName }
            ?.build(dcsItem)
            ?: throw IllegalStateException("Unknown Type ${dcsItem?.type} of NavItem")
}

enum class DSCType(val typeName: String) {

    NAV_MENU("NavMenu") {
        override fun build(dcsItem: DCSItem?): Any {
            TODO("not implemented")
        }
    },

    NAV_LINK("NavLink") {
        override fun build(dcsItem: DCSItem?): Any {
            TODO("not implemented")
        }
    },

    IMAGE("Image") {
        override fun build(dcsItem: DCSItem?): Any {
            TODO("not implemented")
        }
    };

    abstract fun build(dcsItem: DCSItem?): Any
}
0 голосов
/ 28 января 2019

Сделайте ваш входной параметр не обнуляемым и измените вашу функцию на:

override fun presentNativeItem(dcsItem: DCSItem) = when(dcsItem) {
    NAVMENU -> buildNavMenu(dcsItem)
    NAVLINK -> buildNavLink(dcsItem)
    IMAGE -> buildImage(dcsItem)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...