Pull to refresh

Comments 4

А вы знали, что HashMap для enum уступает по эффективности EnumMap?

Если это так, то почему компилятор автоматически не заменяет HashMap для enum на EnumMap?

Хороший поинт. Но в реальности надо самому управлять структурами данных.

Я кстати знаю, что Jackson, при десериализации автоматически выбирает именно HashSet, если в моделе указан интерфейс Set от енума. Так что без подсказок наш софт врятли будет работать наиболее эффективно

Может быть, но почему надо самому? Потому что раньше так делали? Ну раньше и структуры реализовывали самостоятельно в машинных кодах.

Компилятор, как и любая другая программа должна выполнить некоторый контракт. В данном случае контракт это "Я сделаю так, что програмный код будет выполнен не более чем за N шагов, потребляя не более, чем за M памяти". Всё остальное, т.е. каким именно образом компилятор будет исполнять этот контракт, это вообще не дело пользователя. Ну это же основной принцип разделения ПО на слои абстракции - есть слои, между слоями есть контракты, а то, как исполняются эти контракты под капотом каждого слоя, это личное дело каждого слоя и другие слои об это думать не должны. И как я вижу, если программист (пользователь компилятора) вместо того, чтобы ориентироваться на контракт ориентируется на то, как оно там устроено в компиляторе под капотом, по моему это в каком то смысле баг компилятора. Понятно почему - поменялась внутренняя логика работы компилятора, и из-за этого надо переписывать код программы.

В чем то я понимаю, что программисту хочется обладать максимумом контроля над программой. Но как разработчик промышленного компилятора, я в этом вижу нарушения принципа изолированности слоёв ПО.

Попробуйте откомпилировать

import java.util.EnumSet

inline fun <T, reified R : Enum> Iterable.mapToEnumSet(transform: (T) -> R): EnumSet =
mapTo(EnumSet.noneOf(R::class.java), transform)

fun Map<String, T>.test_mapToEnumSet(): Set =
this.entries.drop(5).map { it.value }.mapToEnumSet { it }

fun <T: Enum> Map<String, T>.test2_mapToEnumSet(): Set =
this.entries.drop(5).map { it.value }.mapToEnumSet { it }

inline fun <reified T: Enum> Map<String, T>.test3_mapToEnumSet(): Set =
this.entries.drop(5).map { it.value }.mapToEnumSet { it }

fun Map<String, T>.test_mapToSet(): Set =
this.entries.drop(5).map { it.value }.toSet()



Попытайтесь понять, что не так, почему не всё компилится... И, по крайней мере, вы ответите себе на вопрос почему компилятор (а точнее kotlin standard library) не может ВСЕГДА заменять HashMap на EnumMap. Возможно по похожей/этой причине он и не может ИНОГДА делать эту замену. Хотя скорее всего поскольку нельзя сделать замену ВСЕГДА автоматически, то не имеет смысла ее делать вообще.

PS: В котлине нет EnumMap/EnumSet, они есть только в джаве.

Sign up to leave a comment.

Articles