Эквивалент эквивалента C ++ в Котлине

Проблема, которую я пытаюсь решить:

У меня есть список элементов. Список может быть большим, и их может быть много. Я хотел бы получить к ним доступ по индексу. Для этих индексов я хотел бы использовать слова вместо чисел. Мне также хотелось бы, чтобы эти слова были строго типизированы, поэтому я не могу смешивать числа с ними.

Я считаю, что перечисление Kotlin не подходит для этого, поскольку каждое перечисление является экземпляром объекта. Я могу использовать Int-константы, но тогда я теряю тип безопасности.

В c ++ эта проблема решается Enum. Перечисления могут быть приведены к их базовому типу (во время компиляции), которые будут использоваться в качестве индексов. В том же типе Enum является типом, и если функция принимает его как параметр, компилятор не разрешает передавать целые числа. Перечисления сами по себе не являются самими объектами, поэтому вы можете иметь столько, сколько хотите, без какого-либо повышения производительности ,

Пример кода на 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 } 

Как насчет определения перечисления, а также расширения для индексных списков желаемого типа с элементами перечисления? Таким образом, вы можете ограничить возможности индексирования только списками Foo если вам это нужно. В противном случае сделайте расширение общим.

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

Используйте import com.example.Index.* Чтобы ссылаться на элементы как на FIRST и SECOND .

Или определите неоператорную функцию, которая не путается с оператором:

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

Тем не менее, я не думаю, что в настоящее время существует решение, которое позволит вам иметь псевдонимы для целых чисел, которые вводятся по-разному, и избегать наличия экземпляров для них во время выполнения (ну, возможно, выборочное преобразование источника во время компиляции). Концепция, которая наиболее близка к разрешению, это типы значений , но в настоящее время она не поддерживается ни JVM, ни Kotlin.

Тысячи объектов на самом деле очень мало, но вы можете просто использовать обычные перечисления Kotlin, а затем использовать Proguard для их оптимизации. Он делает это по умолчанию, но вам может потребоваться тщательная настройка его и не забудьте тщательно протестировать приложение после этого.

У вас есть запятая за второй = 1,

Удалите это:

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