Расскажи про все виды классов в Kotlin

Ответ

В Kotlin есть несколько видов классов:

  1. Обычные классы – базовые классы.
class MyClass { ... }
  1. Data-классы – автоматически генерируют equals(), hashCode(), toString(), copy().
data class User(val name: String, val age: Int)
  1. Sealed-классы – ограниченная иерархия (все подклассы известны).
sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
}
  1. Enum-классы – фиксированный набор значений.
enum class Direction { NORTH, SOUTH, EAST, WEST }
  1. Абстрактные классы – нельзя создать экземпляр, могут содержать абстрактные методы.
abstract class Animal {
    abstract fun makeSound()
}
  1. Inner-классы – имеют доступ к членам внешнего класса.
class Outer {
    inner class Inner { ... }
}
  1. Object-классы (Singleton) – единственный экземпляр.
object Singleton { ... }
  1. Companion-объекты – статические методы/поля.
class MyClass {
    companion object { ... }
}
  1. Inline-классы – обёртки для оптимизации (с Kotlin 1.5).
inline class Password(val value: String)

Ответ 18+ 🔞

А, ну вот, решил разобраться с классами в Kotlin? Ну, это ж не просто так, это целый ёперный театр, я тебе скажу. Сидишь такой, думаешь — класс он и в Африке класс, а тут, блядь, овердохуища вариантов. Но не бзди, сейчас разжуём, как есть.

Смотри, самый простой — это обычный класс, как дед в деревне. Ничего лишнего, просто объявил и поехал.

class MyClass { ... }

Дальше идёт data-класс — это вообще песня, чувак. Ты ему поля накидываешь, а он тебе автоматом кучу полезных штук генерирует: equals(), hashCode(), toString(), ещё и copy() в придачу. Красота, а не класс. Идеально для всяких DTO и моделек.

data class User(val name: String, val age: Int)

А вот sealed-класс — это уже хитрая жопа. Он как бы говорит: «Все мои наследники сидят тут, в этом файле, и никуда не высовываются». Удобно для описания результатов операций, когда вариантов конечное число.

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val message: String) : Result()
}

Enum-классы — это классика, как пить дать. Фиксированный набор констант, типа направлений света или дней недели. Проще некуда.

enum class Direction { NORTH, SOUTH, EAST, WEST }

Абстрактный класс — это такой полуфабрикат. Создать его экземпляр нельзя, он создан, чтобы от него наследовались. Может содержать методы как с реализацией, так и абстрактные — которые потомки обязаны дописать. Чувствуешь, да? Терпения ноль ебать, пока всё правильно организуешь.

abstract class Animal {
    abstract fun makeSound()
}

Inner-класс — это тот, который сидит внутри другого класса и имеет доступ ко всем его полям, даже приватным. Как будто живёт на всём готовом.

class Outer {
    inner class Inner { ... }
}

Object-класс — это одиночка, синглтон. Один на весь проект, и хрен ты создашь второй. Удобно для всяких менеджеров или конфигураций.

object Singleton { ... }

Companion object — это статическая область внутри класса. Туда обычно всякие фабричные методы или константы пихают. В Java бы это были static члены.

class MyClass {
    companion object { ... }
}

Ну и наконец, inline-классы (с Kotlin 1.5). Это такие обёртки для примитивов или строк, которые компилятор постарается оптимизировать, чтобы не было накладных расходов на упаковку. Типа, безопасность типов даём, а по цене — почти как примитив.

inline class Password(val value: String)

Вот, собственно, и весь цирк. Главное — не путай их все в кучу, а то получится пиздопроебибна архитектура, а не код. Выбирай по делу, и будет тебе счастье.