在Kotlin中相当于C ++ Enum

我想解决的问题是:

我有一个元素列表。 名单可以很大,可以有很多。 我想通过索引访问它们。 对于那些索引我想用单词而不是数字。 我也想这个词是强types的,所以我不能混合数字。

我相信Kotlin枚举对于这个不好,因为每个枚举本身都是一个对象实例。 我可以使用Int常量,但是然后我失去了types安全性。

在c + +这个问题是由一个枚举解决的。 枚举可以被转换成它们的底层types(在编译时)被用作索引。 在相同的types中,Enum是一个types,如果一个函数将其作为参数,编译器将不允许传入整数。枚举本身不是对象本身,因此您可以拥有尽可能多的性能而不会影响性能。

C ++代码示例来显示我在找什么:

string someArray[] = {"element 0", "element 1"}; enum class Index { first = 0, second = 1, }; string getElement(Index i) { return someArray[(int)i]; } void foo() { auto element0 = getElement(Index::first); auto element1 = getElement(1); // compile time error - parameter type mismatch } 

如何定义一个枚举,也是一个扩展到所需的types与枚举元素的索引列表? 这样,您可以将索引function仅限于Foo列表(如果需要的话)。 否则,使通用扩展。

 enum class Index { FIRST, SECOND } operator fun List.get(index: Index) = get(index.ordinal) // Usage: val foo = listOfFoo[Index.FIRST] 

使用import com.example.Index.*将引用的元素引用为FIRSTSECOND

或者定义一个不会与操作符混淆的非操作符函数:

 fun List.getElement(index: Index) = get(index.ordinal) // Usage: val foo = listOfFoo.getElement(Index.FIRST) 

然而,我不认为目前有一个解决方案,可以让你有不同types的整数的假名,并避免在运行时为他们的实例(也许,在编译时可能会自定义源代码转换)。 最接近于允许这个概念的是值types ,但目前JVM和Kotlin都不支持它。

成千上万的对象真的很少,但是你可以使用正常的Kotlin枚举,然后使用Proguard来优化它们。 它默认是这样做的,但是您可能需要小心配置,并且不要忘记随后彻底测试应用程序。

第二个= 1后面有一个逗号,

删除这个:

 enum class Index { first = 0, second = 1 };