Value-классы в Kotlin 1.5

kotlin

Небольшая статья с рас­ска­зом о новом типе клас­сов в Kotlin 1.5.

РЕКОМЕНДУЕМ:

Пред­ставь себе сле­дующую ситу­ацию. Есть такой класс:

Ба­наль­нейший класс, ана­логи которо­го соз­давал любой прог­раммист. Где‑то в коде так­же есть такая фун­кция:

По­ка все абсо­лют­но нор­маль­но, но что, если ты прос­то перепу­таешь порядок аргу­мен­тов:

В этом слу­чае фун­кция отра­бота­ет абсо­лют­но неп­равиль­но, а сре­да раз­работ­ки не сде­лает ни еди­ного пре­дуп­режде­ния. К тому же если в будущем внут­ренний фор­мат хра­нения дан­ных изме­нит­ся (в этом при­мере проб­лем нет, но в реаль­ном коде ID типа Int может заменить­ся, нап­ример, на тек­сто­вый UID), то перера­баты­вать при­дет­ся весь код, работа­ющий с фун­кци­ей и клас­сом.

Ре­шить эти проб­лемы мож­но так:

То есть обер­нуть прос­тые типы дан­ных в объ­екты. Но! Во‑пер­вых, это неудоб­но, во‑вто­рых, пос­тоян­ное соз­дание объ­ектов в ито­ге при­ведет к падению про­изво­дитель­нос­ти.

Как раз здесь на сце­ну выходит value class. По сути, это класс с одним полем, нап­ример:

Од­нако, в отли­чие от обыч­ного клас­са, value-класс инлай­новый. Он не будет сущес­тво­вать в резуль­тиру­ющем байт‑коде при­ложе­ния. Ком­пилятор раз­вернет все value-клас­сы и будет исполь­зовать вмес­то них сох­ранен­ные внут­ри зна­чения.

Бо­лее того, value-класс может не прос­то хра­нить зна­чение, но и валиди­ровать его. Нап­ример:

Та­кой value-класс выб­росит исклю­чение IllegalArgumentException, если соз­дать его с отри­цатель­ным зна­чени­ем.

Оригинальная статья на английском языке

Понравилась статья? Поделиться с друзьями:
Добавить комментарий