Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio 除了枚举注释之外,kotlin Android中是否还有enum的替代品?_Android Studio_Kotlin - Fatal编程技术网

Android studio 除了枚举注释之外,kotlin Android中是否还有enum的替代品?

Android studio 除了枚举注释之外,kotlin Android中是否还有enum的替代品?,android-studio,kotlin,Android Studio,Kotlin,因此,在我在android(Kotlin)中创建了许多枚举类之后,我了解到,在android中,枚举并不是非常节省空间的。所以我试着找到另一种方法。我找到了枚举注释-@StringDef。然而,Kotlin似乎不太支持这一点,即使我向方法传递了意外的消息,也没有警告或错误消息 为了澄清我想要做的事情:我有大量的常量字符串可以分类到不同的组(我在不同的枚举类中列出了它们),当调用一些setter函数时,我希望调用方只从可以选择的特定组中进行选择 例如: enum class Cat (val br

因此,在我在android(Kotlin)中创建了许多枚举类之后,我了解到,在android中,枚举并不是非常节省空间的。所以我试着找到另一种方法。我找到了枚举注释-
@StringDef
。然而,Kotlin似乎不太支持这一点,即使我向方法传递了意外的消息,也没有警告或错误消息

为了澄清我想要做的事情:我有大量的常量字符串可以分类到不同的组(我在不同的枚举类中列出了它们),当调用一些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){...}
这并不理想,因为我们可以得到当前实现中发生的各种类型的输入错误,这也是我首先切换到enum的原因。但总体而言,空间消耗>类型安全。因此,如果没有更好的方法,我将需要切换回

请让我知道是否有任何有效的方法来实现。我曾经考虑过使用映射或列表,但是索引或访问字符串会变得很麻烦,因为我需要将字符串映射到它们自己(这里没有硬编码字符串,除了第一个赋值,如
AMER\u SHORTHAIR=“American SHORTHAIR”


谢谢。

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

也就是说,Kotlin 1.3()将提供一个新特性:内联类

使用此新功能,您可以执行以下操作:

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)
} 
无论何时使用此值,编译器都会内联原始字符串


与类型别名不同,编译器能够检查内联类的原始类型。

我喜欢使用密封类而不是枚举;它比普通的课堂提供了一些额外的好处;更多关于这个

像这样的东西

class LoggingBehavior@JVMLowloads构造函数(private val logLevel:logLevel=Debug){
趣味日志(标签:String,消息:String){
何时(日志级别){
is Error->Log.e(标记、消息)
is Warn->Log.w(标记、消息)
is Info->Log.i(标记、消息)
是Debug->Log.d(标记、消息)
is Verbose->Log.v(标记、消息)
}
}
}
密封级对数电平
对象错误:LogLevel()
对象警告:日志级别()
对象信息:日志级别()
对象调试:LogLevel()
对象详细:LogLevel()

也可以使用诸如IntDef和StringDef之类的注释。更多的人

了解到,枚举在安卓系统中并不是很节省空间。
哦,天哪,这是7年前的事了。你似乎错过了那场战争。只需使用枚举。枚举和您创建的任何类一样“节省空间”,但我们并没有开始删除类和创建10000行方法。