Kotlin: перечисления с соответствующими значениями; функция внутри 'enum entry' получает ошибку 'неразрешенная ссылка` - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно создать список событий со строкой в ​​качестве имени и список пар в качестве свойств, некоторые свойства событий являются статическими значениями, некоторые требуют динамического изменения, поэтому я создаю специальные функции внутри enum entry для его обновления но выполнил ошибку unresolved reference:

На самом деле, я хочу реализовать список перечислений со связанными значениями, что-то вроде упомянутых статей:

Поскольку у меня более 100 событий, 95% из них являются статическими, только несколько из них необходимо обновить во время выполнения, поэтому запечатанный класс может не подходить для моей ситуации:

    enum class Event(val eventName: String, vararg eventProperties: Pair<String, String?>) {
        LOGIN_CLICKED("Login", ("View" to "button clicked")),

        LOGIN_SUCCEED("Login", ("Type" to "succeed")),

        LOGIN_ERROR("Login") {
            fun errorMessage(errorMessage: String) {
                eventProperties = listOf("ErrorType" to errorMessage)
            }
        },

        // ... some other events

        LIST_ITEM_CLICKED("LIST") {
            fun listItemName(itemName: String) {
                eventProperties = listOf("View" to itemName)
            }
        };

        var eventProperties: List<Pair<String, String?>>? = listOf(*eventProperties)


// Although this approach can fix my problem, but I don't prefer it,
// because these functions are only meaningful to specific enum item,
// I don't want them be opened to all enum items.
//
//        fun errorMessage(errorMessage: String) {
//            eventProperties = listOf("ErrorType" to errorMessage)
//        }

//        fun listItemName(itemName: String) {
//            eventProperties = listOf("View" to itemName)
//        }
    }

    fun main(args: Array<String>) {

        // unresolved reference
        println(Event.LOGIN_ERROR.eventProperties)
        Event.LOGIN_ERROR.errorMessage("error password")
        println(Event.LOGIN_ERROR.eventProperties)
    }

1 Ответ

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

Поскольку у меня более 100 событий, 95% из них являются статическими, только несколько из них необходимо обновить во время выполнения, поэтому закрытый класс может не подходить для моей ситуации

Почему бы и нет? Если вам надоели более длинные объявления:

object LoginClicked : Event("Login", mapOf("View" to "button clicked")) 
\\ vs
LOGIN_CLICKED("Login", mapOf("View" to "button clicked"))

вы можете создать помощника enum class для них:

sealed class Event(val eventName: String, val eventProperties: Map<String, String?>) {
   enum class Basic(val eventName: String, val eventProperties: Map<String, String?>) {
        LOGIN_CLICKED("Login", mapOf("View" to "button clicked")),
        LOGIN_SUCCEED("Login", mapOf("Type" to "succeed")),       
        ...
   }

   class BasicEvent(b: Basic) : Event(b.eventName, b.eventProperties)

   class LoginError(errorMessage: String) : Event("Login", mapOf("ErrorType" to errorMessage))
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...