Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме KotlinВсе вопросы
KotlinMiddleТеория

Что такое value classes (ранее inline classes) в Kotlin?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Value class — обёртка над одним значением, которую JVM заменяет примитивом напрямую (без heap-аллокации) в большинстве случаев. Даёт типобезопасность без накладных расходов.

Объявление

@JvmInline
value class Email(val address: String) {
    init {
        require(address.contains('@')) { "Invalid email: $address" }
    }

    fun domain(): String = address.substringAfter('@')
}

@JvmInline
value class UserId(val id: Long)

fun sendEmail(email: Email, sender: UserId) {
    println("Sending to ${email.address} from user ${sender.id}")
}

fun main() {
    val email = Email("alice@example.com")
    val userId = UserId(42L)
    sendEmail(email, userId)  // в байткоде: sendEmail(String, long)
    println(email.domain())   // example.com
}

Что такое value class

Value class (раньше назывался inline class) — класс, аннотированный @JvmInline и объявленный с ключевым словом value. Он оборачивает ровно одно неизменяемое свойство. Компилятор Kotlin заменяет экземпляры value class на сам тип обёртываемого значения везде, где это возможно, избегая создания объекта на куче.

Зачем нужны value classes

  • Типобезопасность: нельзя случайно передать UserId туда, где ожидается OrderId, даже если оба — Long.
  • Производительность: JVM обрабатывает Email как String — нет аллокации обёртки.
  • Валидация: init-блок выполняется при создании, даже в unboxed-режиме.
  • Методы: можно добавлять методы и реализовывать интерфейсы.

Реализация интерфейсов

interface Printable {
    fun print()
}

@JvmInline
value class Name(val value: String) : Printable {
    override fun print() = println("Name: $value")
}

fun printAll(items: List<Printable>) {
    items.forEach { it.print() }  // здесь происходит boxing!
}

Когда происходит boxing

  • Generic-позиции: List<Email>, Map<UserId, Email>
  • Nullable: Email?
  • Вызов через интерфейс
  • Рефлексия

Ограничения

  • Ровно одно свойство в primary constructor, только val.
  • Нельзя наследоваться от других классов (кроме Any).
  • Нет backing fields кроме единственного свойства.
  • Не поддерживает делегирование свойств внутри класса.

Подводные камни

  • Забывают @JvmInline — без неё value class не компилируется на JVM-таргете.
  • Nullable value class всегда boxed — использование UserId? повсюду сводит на нет оптимизацию.
  • Java-код видит метод с суффиксом -impl и -DefaultConstructorMarker — прямой вызов из Java требует специального companion-метода.
  • В generic-коллекциях (listOf(Email("a@b.c"))) boxing всё равно происходит — аллокация не устранена.
  • Equals и hashCode делегируют обёртываемому типу — два разных value class над Long будут равны, если Long-значения равны (при boxing).
  • init-блок вызывается в конструкторе, но JVM может соптимизировать unboxed-путь без вызова конструктора — проверяйте байткод при критичной валидации.
  • Serialization: kotlinx.serialization требует явного @Serializable, а JSON-формат может отличаться от ожидаемого (обёртка vs raw-значение).

Частые вопросы на собеседовании

  • Что такое structured concurrency в Kotlin?
  • Для каких задач Kotlin является сильным выбором, а где лучше честно выбрать другой язык?
  • В чём разница между val и var в Kotlin?
  • В чём разница между List и MutableList в Kotlin?

Типичные ошибки

  • Объяснять «value classes» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Нельзя обещать нулевой overhead всегда: boxing появляется на generic границах, nullable значениях и интерфейсах.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

Что проверяет интервьюер

  • Формулирует суть темы «value classes» своими словами и связывает ее с кодом.
  • Называет механизм: Она объявляется как @JvmInline value class с единственным primary constructor property и имеет ограничения на identity и inheritance.
  • Видит production-последствие: Нельзя обещать нулевой overhead всегда: boxing появляется на generic границах, nullable значениях и интерфейсах.

Как вы знаете этот вопрос?

Проверить себя по теме Kotlin →

Источники

  • https://kotlinlang.org/docs/inline-classes.html

Связанные темы

Kotlinkotlin-languagevalue-classes-reasoning

Вакансии с этим навыком

Kotlin вакансии
  • Software Engineer II
  • Senior Software Engineer – Web & Desktop Applications
  • Senior Android Developer - Logistics & Digital Services (f/m/x)
  • Senior Android Developer with Kotlin Multiplatform (f/m/x)
  • Engineering Lead - Send for Partners