https://kotlinlang.org logo
#russian
Title
# russian
a

Alex

08/26/2021, 2:29 PM
Кто-нибудь вкурсе
value
классы работают в Exposed?
i

Iaroslav Postovalov

08/26/2021, 4:22 PM
Если реализовать соответствующий
ColumnType
для
value class
, то у вас все будет работать.
a

Alex

08/26/2021, 4:24 PM
Спасибо. Подумаю стоит ли свичаться со Спринг даты на Exposed :)
a

altavir

08/26/2021, 4:46 PM
А что вы хотите от value классов?
a

Alex

08/26/2021, 4:48 PM
У меня есть доменная айдишка, которая сама по себе просто строка. По сути эти Value Object. Вот, хочу ее в таком же виде и хранить в базе, без всяких трансформаций. Спринг дата не поддерживает value классы.
В целом, я джавой/котлином занимаюсь всего пол года, поэтому может я чего не так делаю/чего-то не так понимаю.
a

altavir

08/26/2021, 4:50 PM
Ну в принципе да, просто для строки value класс особенно много чего не даст. В exposed нет рефлексии, так что должно работать
a

Alex

08/26/2021, 4:52 PM
То как мне объяснили, что такое в джаве инлайн классы, мне казалось, что это как раз то, что мне нужно. Придать какой-то строке доменный смысл.
a

altavir

08/26/2021, 4:59 PM
Это нужно для того, чтобы сэкономить на оверхеде при завертывании строки в другой класс. Для строки этот оверхед очень маленький и если у вас не три миллиона таких строк, то не факт, что это нужно
a

Alex

08/26/2021, 5:00 PM
Согласен. В целом это был просто повод попробовать инлайн классы. Я уже ревертнул все обратно и сделал просто тайпалиас, хотя и в этом смысла не много. Хотелось, просто сделать красиво, по-доменному.)
a

altavir

08/26/2021, 5:01 PM
Value-класс - это метод оптимизации, у него нет (пока по крайней мере) отдельного семантического смысла.
a

Alex

08/26/2021, 5:01 PM
Я понимаю, с точки зрения языка - да.
С точки зрения просто структуры кода - вполне, мне кажется. Строка получает какое-то конкретное предназначение.)
a

altavir

08/26/2021, 5:02 PM
Смысл в том, что вы и так можете завернуть эту строку в класс, не делая к нему модификатор value
a

Alex

08/26/2021, 5:03 PM
Можно, да. Но тогда либо иметь геттеры, либо туСтринг переписать.
a

altavir

08/26/2021, 5:04 PM
А value-класс вас от этого не спасет
a

Alex

08/26/2021, 5:05 PM
А можно что-нибудь почитать, что лучше объяснить суть инлайн классов в джаве? Я так-то с пхп мира пришёл, до этого ни строчки на джаве, и уж тем более на котлине, не писал.
a

altavir

08/26/2021, 5:05 PM
Повторюсь, на данный момент это просто оптимизация для оберточных классов, которые оборачивают ровно одно поле.
a

Alex

08/26/2021, 5:06 PM
В котлине или вообще в джаве?
a

altavir

08/26/2021, 5:07 PM
Вы совершенно спокойно написать
Copy code
class MyId(val string: String)
и использовать его.
В джаве нет пока инлайн классов и не известно, когда будут
a

Alex

08/26/2021, 5:07 PM
А. Понятно. Теперь я вижу как мои вопросы звучат слегка нелепо.)
a

altavir

08/26/2021, 5:08 PM
Да нет, это очень частый вопрос. Просто value - классы часто пихают там, где без них можно отлично обойтись, а проблемы от них есть все равно. Это чисто оптимизационная фича
a

Alex

08/26/2021, 5:09 PM
Понял. Спасибо! Да, я действительно хотел его пихнуть скорее чтоб пихнуть, чем от необходимости. Понимание было совсем другое.)
i

ilya.gorbunov

08/26/2021, 5:18 PM
спокойно написать class MyId(val string: String)
@altavir А equals/hashCode/toString тоже спокойно руками написать?
a

Alex

08/26/2021, 5:19 PM
Ну, можно немного и понервничать же тоже?
a

altavir

08/26/2021, 5:20 PM
@ilya.gorbunov для value класса они довольно непредксазуемо работают
i

ilya.gorbunov

08/26/2021, 5:23 PM
Непредсказуемо — в смысле не хватает документации того, как они генерируются?
a

altavir

08/26/2021, 5:37 PM
Вот грабли, на которые я сам наступал: интерфейс, его наследуют два класса, один из них инлайн/value. Как будет работать сравнение? Ответ, оно будет работать странно. Сравнение для value классов - это вообще опасная дорожка, потому что они по идее могут сравниваться только структурно, а значит по хорошему только сами с собой. Hashcode в основном используется для ключей в картах, но использовать value классы как ключи (пока) не особенно осмысленно, потому что они мгновенно теряют всю свою оптимизационную суть.
i

ilya.gorbunov

08/26/2021, 6:40 PM
потому что они по идее могут сравниваться только структурно, а значит по хорошему только сами с собой.
А разве сгенерированный equals как раз не такой? Первым же делом идет проверка что второй инстанс ровно того же value-типа
a

altavir

08/26/2021, 6:51 PM
Я к тому, что он получается не симметричный. Если один наследник value класс, а второй - нет, то получается труба
i

ilya.gorbunov

08/26/2021, 6:58 PM
Пока есть ограничение, что equals нельзя переопределить, например в случаях, когда нужно чтобы разные наследники были сравнимы между собой, но в будущем это ограничение может быть снято.
a

altavir

08/26/2021, 7:00 PM
Я знаю. Просто мы много где пытались по делу воткнуть инлайн классы и мест, где это реально помогает получается очень мало (а багов с ними много). При этом желающих воткнуть их ради того, чтобы воткнуть, очень много. Поэтому я не говорю, что их не надо использовать, но рекомендую руководствоваться принципом "если вы не знаете, нужно оно вам или нет, значит не нужно".
i

Iaroslav Postovalov

08/26/2021, 7:05 PM
TL;DR, лучше использовать
data class
одного поля.
a

altavir

08/27/2021, 6:02 AM
Ну вот пока да. При всей моей любви к концепции value-классов
7 Views