Часто встречаю код, где используется switch/when, ...
# russian
m
Часто встречаю код, где используется switch/when, каждый кейс которого — возврат константы. Хочется переделать такой код в данные, но • HashMap тяжеловаты, тем более если добавить идиому с
hashMapOf(варарг пар)
• можно заводить массив ключей и массив значений и искать линейно, при размере в 10 элементов никто не пострадает, но некрасиво и неподдерживаемо • часто ключи или значения примитивны, а ради пары таких мест совсем не хочется затаскивать trove или что-нибудь в этом роде • иногда можно взять энамы, но это отдельный класс со всем приданным ($VALUES, имена констант и т. п.) в итоге зачастую оставляю страшненький switch/when, потому что просто ничего лучше не могу предложить. Фантазирую какой-то, извините за грубое слово, макрос
Copy code
val mapping = wtf![
    key : value,
    key : value,
    default: value
]
...
mapping[key]
который скомпилируется во что-нибудь такое
Copy code
val mappingKeys = arrayOf(key, key, ...) // sorted
val mappingValues = arrayOf(value, value, ...) // sorted according to key set
val mappingDefault = default
...
mappingKeys.binarySearch(key).let { if (it < 0) default else mappingValues[it] }
Даже не знаю, в какой канал с этим, т. к. не предложение, а рассуждение и нытьё 🙂
a
А это развен не enum в чистом виде?
m
В принципе это похоже на inline enum, только у энамов valueOf хранит LRU-кэш и создаёт хэшмапу, а этого совсем не хочется
a
У вас тыщи выборов?
Или в чём проблема мапы?
m
Да, но тогда нужно писать код инициализации. put, вот это всё. И снова декларативно не вышло.
a
Пишется один раз билдер на экстеншенах и все. Потом можно забыть про то, что там внутри
Единственное, чего можно было бы улучшить в смысле красоты - это использовать что-то операторо-подобное вместо
to
, но тут можно грабли подложить.
Если речь опять про оптимизацию, то тут надо помнить, что все это имеет смысл только на нейтиве