Что такое инлайн-классы в котлине? - PullRequest
0 голосов
/ 11 апреля 2019

Встроенные классы: Встроенные классы

Я хочу знать, каково точное отличие встроенных классов от других классов в kotlin?И я хочу знать, что именно делает встроенный класс и когда мы будем его использовать?

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

Встроенные классы - это просто некие типизированные оболочки над примитивными типами и строками.

Например, представьте, что у нас есть объявление интерфейса, подобное этому:

interface ResizeableView {
    fun resize(width: Int, height: Int)
}

Каждый раз, когда разработчику нужно вызвать этот метод, он должен сначала проверить порядок параметров, чтобы не перепутать ширину и высоту.

И все же, что произойдет, если параметры в конечном итоге испортятся?

val width: Int = someObject.width
val height: Int = someObject.height
resizeableView.resize(height, width) //compiles ok and brings a bug to the program

Этот пример прост и понятен, но для некоторого другого случая, когда метод объявляет группу параметров примитивного типа, которые соответствуют одному типу, нежелательное поведение программы может быть не так легко понято и, таким образом, обнаружена путаница аргументов. .

Встроенные классы помогают с этим:

inline class Width(val value: Int)
inline class Height(val value: Int)

interface ResizeableView {
    fun resize(width: Width, height: Height)
}

Поскольку Width и Height теперь отличаются типами , путаница устраняется при вызове метода.

val width: Width = someObject.width
val height: Height = someObject.height
resizeableView.resize(height, width) //compile-time error

Но какой здесь смысл в модификаторе inline? Почему просто не использовать class Width? Ключевым моментом является то, что inline classes вводит тип только при типе компиляции, и во время выполнения эти переменные будут просто int -s, поэтому не будут создаваться накладные расходы времени выполнения.

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

0 голосов
/ 11 апреля 2019

Я хотел бы добавить больше деталей, кроме ответа @ Андрея Илюнина .

Встроенные классы заменяются базовыми значениями в скомпилированном коде, что делает его более производительным.Но почему?

Значения хранятся либо в стеке, либо в куче в JVM.Для обычного объекта Heap, но выделения и выборки памяти в Heap медленнее, чем Stack.Заменив класс его базовым значением, JVM сможет сохранить его в стеке, поэтому встроенные классы быстрее обычных классов.

Но это не всегда так.

Компилятор недостаточно умен, чтобы заменять каждый встроенный класс их базовым значением.

встроенный класс упаковывается, когда он используется в качестве другого типа.Распакованный встроенный класс используется, когда статически известно, что значение является встроенным классом.

Вы должны прочитать больше в здесь , чтобы понять, когда встроенный класс может быть представлен его базовым значением.Встроенные классы становятся быстрее только тогда, когда значение фактически встроено в скомпилированный код.

0 голосов
/ 11 апреля 2019

Встроенные классы предоставляют нам способ обертывания типа, таким образом добавляя функциональность и создавая новый тип сам по себе.

В отличие от обычных (не встроенных) оболочек, они выиграют от повышения производительности.Это происходит потому, что данные встроены в их использование, и создание экземпляра объекта в результирующем скомпилированном коде пропускается.

Хороший пример можно увидеть на this

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...