Как стать автором
Обновить

Классы значения в Kotlin: прощайте псевдонимы типов?

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров7.5K
Всего голосов 10: ↑9 и ↓1+11
Комментарии10

Комментарии 10

А аналога шарповых структур в Kotlin нет? Раньше думал что это, как раз, data классы, а они, оказывается, в куче лежат.

Похоже, Kotlin так и не умеет оптимизировать массивы дата-классов из-за ограничений самой JVM. Буду рад, если профессионалы объяснят более подробно.

Например, если мне нужен массив из 10000 элементов типа (Int, Int, Int), то надо создавать массив из 30000 элементов примитивного типа и индексировать каждое поле вручную. Это неструктурно, непонятно для компилятора, трудно векторизуемо, но всё равно работает быстрее, чем массив из 10000 экземпляров класса.

есть вариант с

class TupleSystem {
  val fieldA = IntArray()
  val fieldB = IntArray()
  val fieldC = IntArray()

  operator fun get(i: Int) = Tuple(fieldA[i], fieldB[i], fieldC[i])
  fun someBunchAction() = (0 until fieldA.size).forEachIndexed { 
    i, it -> fieldC[i] = fieldA[i] + fieldB[i]
  }
}

Не векторизуется и не кэш-френдли. Тормозить, скорее всего, будет даже больше, чем классы в куче.

Непримитивных структур нет в Котлине, потому что их не поддерживает JVM

Опасный путь - добавлять фичи постфактум. Язык разбухает и теряет простоту и элегантность.

если не добавлять фичи постфактум - приложение умирает.

А Jackson умеет десериализацию в value class?

да

Я очень удивлён, что typealias позволяет передать переменную типа Weight в тип Brightness. Неочевидное решение.

Какой тогда смысл в typealias кроме нейминга?

На первый взгляд в golang аналогичные типы понятнее.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории