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 }; 
  • Android: Obtenga un DAO en un ViewModel
  • No puede abrir el proyecto después de actualizar Android Studio
  • ¿Cuáles son los posibles valores que se le pueden dar a `@ Suppress` en Kotlin?
  • ¿Llamar a super en el constructor y asignar un campo en Kotlin?
  • ¿Cómo declarar el valor del array en las annotations de Kotlin?
  • Referencias a funciones genéricas
  • ¿Por qué HashMap.get no devuelve un tipo que admite nulos?
  • La vista de reciclador no se infló. Obteniendo el error "Sin adaptador conectado, omitiendo el layout"
  • Error de Kotlin al hacer reference a la actividad de la class interna
  • Cómo Kotlin tomará val como palabra key de la class java
  • DBFlow: datos de consulta de la columna especificada