C ++ Enum equivalente en Kotlin

El problema que bash resolver:

Tengo una list de elementos. La list puede ser grande y puede haber muchas. Me gustaría acceder a ellos por índice. Para esos índices, me gustaría usar palabras en lugar de numbers. También me gustaría que estas palabras estén fuertemente tipadas, así que no puedo mezclar numbers con ellas.

Creo que Kotlin enum no es bueno para esto, ya que cada enumeración es una instancia de object en sí misma. Puedo usar constantes de Int, pero luego pierdo el tipo de security.

En c ++ este problema es resuelto por un Enum. Las enumeraciones se pueden convertir a su tipo subyacente (en time de compilation) para usarlas como índices. En el mismo tipo, Enum es un tipo y si una function lo toma como parámetro, el comstackdor no permitirá el paso de integers. Las enumeraciones en sí mismas no son objects, por lo que puede tener todas las que quiera sin ningún golpe de performance .

Ejemplo de código C ++ para mostrar lo que estoy buscando:

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 } 

¿Qué hay de la definición de una enumeración y también una extensión para indexar las lists del tipo deseado con los elementos enum? De esta forma, puede limitar las capacidades de indexing solo a lists de Foo si lo necesita. De lo contrario, haga la extensión genérica.

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

Use import com.example.Index.* hacer reference a los elementos como FIRST y SECOND .

O define una function sin operador que no se confunda con el operador:

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

Sin embargo, no creo que haya una solución que le permita a ambos tener seudónimos para integers que se tipean de manera diferente, y evitar tener instancias para ellos en time de ejecución (bueno, tal vez una transformación de fuente personalizada en time de compilation). El concepto que está más cerca de permitir esto es el tipo de valor , pero actualmente no es compatible con JVM ni Kotlin.

Miles de objects es realmente muy poco, pero podrías usar las enumeraciones normales de Kotlin y luego usar Proguard para optimizarlas. Lo hace de manera pnetworkingeterminada, pero es posible que deba tener cuidado de configurarlo y no olvide probar la aplicación a background después.

Tienes una coma detrás de second = 1,

Eliminar eso a esto:

 enum class Index { first = 0, second = 1 }; 
  • NullPointerException al intentar acceder al campo henetworkingado
  • Kotlin y Jack no son compatibles (Android Studio 2.3.2)
  • Android, Gradle, Realm, Kotlin: Error: error: no se pudo encontrar el file AndroidManifest.xml
  • Deslice el disparador OnLoadFailed () después de cargar toda la image después de desplazarse hacia abajo y desplazarse hacia arriba
  • ¿Cómo reemploop los espacios en blanco duplicates en una cadena en Kotlin?
  • Cómo utilizar completamente SortedList de RecyclerView
  • ¿Cómo build buffers de protocolo de Google y Kotlin usando Gradle?
  • Bloqueando el serialVersionUID en Kotlin
  • Error de informe de IntelliJ corriendo por un file no encontrado en un module que creé
  • Escribir un Inputstream grande para archivar en Kotlin
  • usando Kotlin con Gradle