除了枚举注释外,kotlin Android中是否可以替代枚举?

时间:2018-08-01 01:14:34

标签: android-studio kotlin

因此,在android(科特林)中创建了很多枚举类之后,我了解到枚举在android中不是非常节省空间。因此,我试图找到另一种方法。我找到了枚举的注释-@StringDef。但是,即使我将意外的内容传递给方法,Kotlin似乎对此也不太支持,也没有警告或错误消息。

因此,为了澄清我要做什么:我有大量的常量字符串可以分为不同的组(我在不同的enum类中列出了它们),并且在调用某些setter函数时,我希望调用者只能从中选择可以选择的特定事物。

例如:

enum class Cat (val breed: String){
    AMER_SHORTHAIR("American Shorthair"),
    SIAMESE("Siamese");
}
enum class Dog (val breed: String){
    GOLDEN_R("Golden Retriever"),
    POODLE("Poodle");
}
fun adopt(cat: Cat, dog: Dog){
    print("I adopted a "+cat.breed+" and a "+dog.breed)
}

在这种情况下,我只能从猫中选择第一个参数,然后从狗中选择第二个参数。有没有一种方法可以在不使用枚举的情况下进行这种类型安全的方法?

为避免使用枚举,我可能需要将上述功能更改为:

const val AMER_SHORTHAIR = "American Shorthair"
const val SIAMESE = "Siamese"
const val GOLDEN_R = "Golden Retriever"
const val POODLE = "Poodle"
fun adopt(cat: String, dog: String){...}

这不是理想的,因为我们可以获得当前实现中发生的各种错别字,这就是为什么我首先切换到枚举的原因。但总体而言,空间消耗>类型安全。因此,如果没有更好的方法,我将需要切换回去。

请让我知道是否有任何有效的方法来实现。我曾考虑过使用地图或列表,但是索引或访问字符串变得很麻烦,因为我需要将字符串映射到自身(这里没有硬编码的字符串,除了第一个赋值,例如AMER_SHORTHAIR = "American Shorthair"之外。)

谢谢。

2 个答案:

答案 0 :(得分:1)

我同意@EpicPandaForce的评论:您不应以这种方式优化枚举。

也就是说,将有一个新功能:Kotlin 1.3(https://blog.jetbrains.com/kotlin/2018/07/see-whats-coming-in-kotlin-1-3-m1/)中的 Inline Classs

有了这项新功能,您可以执行以下操作:

inline data class Cat(private val breed: String)
inline data class Dog(private val breed: String)

val AMER_SHORTHAIR = Cat("American Shorthair");
val SIAMESE = Cat("Siamese");

val GOLDEN_R = Dog("Golden Retriever");
val POODLE = Dog("Poodle");  

fun adopt(cat: Cat, dog: Dog){
    print("I adopted a "+cat.breed+" and a "+dog.breed)
} 

无论何时使用此值,编译器都会内联到原始字符串。

类型别名相比,编译器能够检查内联类的原始类型。

答案 1 :(得分:0)

我喜欢用Sealed类代替Enums。它提供了比普通班级更多的礼物;有关here

的更多信息

像这样的东西

class LoggingBehaviour @JvmOverloads constructor(private val logLevel: LogLevel = Debug) {
    fun log(tag: String, message: String) {
        when (logLevel) {
            is Error -> Log.e(tag, message)
            is Warn -> Log.w(tag, message)
            is Info -> Log.i(tag, message)
            is Debug -> Log.d(tag, message)
            is Verbose -> Log.v(tag, message)
        }
    }
}

sealed class LogLevel
object Error : LogLevel()
object Warn : LogLevel()
object Info : LogLevel()
object Debug : LogLevel()
object Verbose : LogLevel()

还可以使用IntDef和StringDef之类的注释。更多here