Рефакторинг метода Котлина с использованием лямбды - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть следующий класс emun для представления моих представлений панели навигации.

enum class NavigationPosition(val position: Int, val id: Int) {
    HOME(0, R.id.nav_home),
    SEARCH(1, R.id.nav_search),
    PROFILE(2, R.id.nav_profile),
    SETTINGS(3, R.id.nav_settings);
}

В настоящее время я использую следующий метод для обратного поиска по позиции

fun getByPosition(position: Int): NavigationPosition = when (position) {
    0 -> NavigationPosition.HOME
    1 -> NavigationPosition.SEARCH
    2 -> NavigationPosition.PROFILE
    3 -> NavigationPosition.SETTINGS
    else ->  NavigationPosition.HOME
}

var navigationPosition = getByPosition(position)

IsЕсть ли более простой способ рефакторинга getByPosition с использованием лямбда-выражения Kotlin или функции расширения?

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Как уже упоминалось, вы можете использовать NavigationPosition.values(). Однако предлагаемые в настоящее время способы НЕ эффективны с точки зрения памяти.Функция values ​​создает новый массив каждый раз, когда он называется .Я настоятельно рекомендую вам кэшировать его в статической переменной, чтобы убедиться, что он не инициализируется при каждом вызове, поскольку это неэффективно.

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

companion object {
    private val values = values()
    fun getPositionById(id: Int) = if(id < values.size && id >= 0) values[i] else HOME
}
0 голосов
/ 23 ноября 2018

Я думаю, вы хотите это:

NavigationPosition.values()[position]

NavigationPosition.values() - это массив, содержащий значения перечисления.Таким образом, вы можете получить тот же результат:

fun getByPosition(position: Int): NavigationPosition  {
    return if (position >= NavigationPosition.values().size)
        NavigationPosition.HOME
    else
        NavigationPosition.values()[position]
}
...