Встроенные классы - это просто некие типизированные оболочки над примитивными типами и строками.
Например, представьте, что у нас есть объявление интерфейса, подобное этому:
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, поэтому не будут создаваться накладные расходы времени выполнения.
Здесь - хороший пример применения встроенных классов в реальном мире.