Android Kotlin:具有关联值的枚举;内部函数';枚举条目';获取“未解析引用”错误

Android Kotlin:具有关联值的枚举;内部函数';枚举条目';获取“未解析引用”错误,android,kotlin,Android,Kotlin,我需要创建一个事件列表,以字符串作为名称,以对列表作为属性,有些事件属性是静态值,有些需要动态更改,因此我在枚举项中创建了特定的函数来更新它,但遵守了错误未解析引用: 实际上,我要实现的是一个带有关联值的枚举列表, 类似这些文章提到的: ,或 ,或 因为我有100多个事件,其中95%是静态的,只有几个事件需要在运行时更新,所以密封类可能不适合我的情况: enum class Event(val eventName: String, vararg eventProperties: P

我需要创建一个事件列表,以字符串作为名称,以对列表作为属性,有些事件属性是静态值,有些需要动态更改,因此我在
枚举项中创建了特定的函数来更新它,但遵守了错误
未解析引用

实际上,我要实现的是一个带有关联值的枚举列表, 类似这些文章提到的:

  • ,或
  • ,或
因为我有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)
    }
enum类事件(val-eventName:String,vararg-eventProperties:Pair){
点击登录(“登录”,“查看”到“点击按钮”),
登录成功(“登录”,“键入”至“成功”),
登录错误(“登录”){
趣味errorMessage(errorMessage:String){
eventProperties=listOf(“ErrorType”到errorMessage)
}
},
//…其他一些事件
列表项目点击(“列表”){
趣味listItemName(itemName:String){
eventProperties=listOf(“查看”到itemName)
}
};
var eventProperties:List?=listOf(*eventProperties)
//虽然这种方法可以解决我的问题,但我不喜欢,
//因为这些函数只对特定的枚举项有意义,
//我不希望它们对所有枚举项都打开。
//
//趣味errorMessage(errorMessage:String){
//eventProperties=listOf(“ErrorType”到errorMessage)
//        }
//趣味listItemName(itemName:String){
//eventProperties=listOf(“查看”到itemName)
//        }
}
趣味主线(args:Array){
//未解析引用
println(Event.LOGIN\u ERROR.eventProperties)
Event.LOGIN\u ERROR.errorMessage(“错误密码”)
println(Event.LOGIN\u ERROR.eventProperties)
}
因为我有100多个事件,其中95%是静态的,只有几个事件需要在运行时更新,所以密封类可能不适合我的情况

为什么不呢?如果您对稍长的声明感到困扰:

object LoginClicked : Event("Login", mapOf("View" to "button clicked")) 
\\ vs
LOGIN_CLICKED("Login", mapOf("View" to "button clicked"))
您可以为它们创建帮助器
enum类

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))
   ...
}
密封类事件(val-eventName:String,val-eventProperties:Map){
枚举类基本(val eventName:String,val eventProperties:Map){
单击登录(“登录”,映射(“查看”到“单击按钮”),
登录成功(“登录”,映射为(“键入”到“成功”),
...
}
类BasicEvent(b:Basic):事件(b.eventName,b.eventProperties)
类LoginError(errorMessage:String):事件(“登录”,映射(“ErrorType”到errorMessage))
...
}

是的,我现在正在使用
密封类
。我最初没有考虑使用密封类的原因是,我认为只有一个常量的CREAT一百类可能是一个巨大的代价,但是后来我发现我可以使用<代码>对象< /代码> -我不是100%肯定-这可能与EnUM条目相同。代码>销售类
解决了我的问题。非常感谢!啊,好的
object
确实创建了一个类文件,所以这个成本确实存在,但即使在Android上也没有那么大。我的回答中的解决方案仍然可以避免它。