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

+687новых вакансий за сутки·55 254вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

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

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

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

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

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

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

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

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

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

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

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

В чём разница между abstract class и interface в Kotlin?

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

abstract class хранит состояние и имеет конструктор, допускает одно наследование. interface описывает контракт без backing fields, поддерживает default-методы и множественную реализацию.

Пример

// abstract class хранит состояние и имеет конструктор
abstract class BaseRepository(
    protected val db: Database
) {
    abstract suspend fun findById(id: Long): Entity?

    suspend fun exists(id: Long): Boolean = findById(id) != null
}

// interface описывает контракт — без состояния
interface Cacheable {
    val cacheKey: String

    fun invalidate() {
        CacheManager.evict(cacheKey) // default-реализация
    }
}

// Класс наследует один abstract class и реализует несколько интерфейсов
class UserRepository(
    db: Database,
    private val redis: RedisClient
) : BaseRepository(db), Cacheable, AutoCloseable {

    override val cacheKey = "users"

    override suspend fun findById(id: Long): Entity? =
        redis.get("user:$id") ?: db.query("SELECT * FROM users WHERE id = ?", id)

    override fun close() = redis.close()
}

Ключевые отличия

abstract class — это класс с частичной реализацией. Он может хранить состояние (поля с backing fields), иметь конструкторы с параметрами, и от него можно наследоваться только один раз. interface — это контракт без состояния (нет backing fields), он может содержать default-методы, но не может иметь конструктор. Класс может реализовать сколько угодно интерфейсов.

Когда выбирать abstract class

  • Нужно разделить общее состояние между наследниками (например, val scope: CoroutineScope).
  • Нужен конструктор с обязательными параметрами — интерфейс так не может.
  • Хотите запретить реализацию вне модуля — sealed abstract class.

Когда выбирать interface

  • Нужна множественная реализация — класс реализует несколько интерфейсов одновременно.
  • Описываете чистый контракт без привязки к иерархии (Comparable, Serializable).
  • Нужна binary compatibility при эволюции API — добавление default-метода не ломает клиентов.

Kotlin vs Java: важные нюансы

В Kotlin интерфейсы могут содержать свойства — но только вычисляемые (без backing field). Если в интерфейсе написать val name: String = "default" — это ошибка компиляции. Abstract class может иметь val name: String = "default" с backing field.

При конфликте default-методов из двух интерфейсов компилятор требует явного override в классе:

interface A { fun greet() = println("A") }
interface B { fun greet() = println("B") }

class C : A, B {
    override fun greet() = super<A>.greet() // обязательно выбрать
}

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

  • Backing fields в интерфейсах недоступны — val x: Int в интерфейсе не имеет поля хранения, каждый реализатор создаёт своё.
  • Конструктор abstract class вызывается при создании экземпляра наследника — не вызывайте переопределяемые методы в конструкторе, они вызовутся в контексте дочернего класса до инициализации его полей.
  • Sealed interface vs sealed abstract class — sealed interface позволяет реализовывать другие интерфейсы, sealed abstract class — нет. Выбор влияет на exhaustive when.
  • Java-совместимость — default-методы интерфейсов Kotlin компилируются в Java через DefaultImpls inner class; при interop с Java это может удивить.
  • Visibility — interface не может иметь private constructor, поэтому нельзя ограничить реализацию только своим модулем без sealed.
  • Делегирование — Kotlin поддерживает делегирование интерфейса через by: class LoggingRepo(delegate: Repo) : Repo by delegate. Для abstract class такой механизм недоступен.
  • Тестируемость — abstract class труднее мокировать: Mockito/MockK создают subclass, что может конфликтовать с final методами. Interface мокируется тривиально.

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

  • Объяснять «abstract class и interface» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Не стоит выбирать abstract class только ради общего helper-кода, если зависимость должна быть ортогональной роли.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

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

  • Формулирует суть темы «abstract class и interface» своими словами и связывает ее с кодом.
  • Называет механизм: Класс может реализовать несколько interfaces, но наследоваться только от одного класса; выбор влияет на композицию и binary compatibility.
  • Видит production-последствие: Не стоит выбирать abstract class только ради общего helper-кода, если зависимость должна быть ортогональной роли.

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

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

Источники

  • https://kotlinlang.org/docs/classes.html
  • https://kotlinlang.org/docs/interfaces.html

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

Kotlinabstract-class-interface-reasoningkotlin-language

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

Kotlin вакансии
  • Java Software Engineer, Shipping Calculation Platform Group - EC Logistics Development Department (ECLD)
  • Senior Software Engineer, Communication Platform Group - Marketing Cloud Platform Department (MCPD)
  • Senior Web Application Engineer (GORA) - Life & Leisure Service Development Department (LLSD)
  • Software Engineer
  • Mid/Senior Software Engineer

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

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