s

smallufo

02/14/2022, 1:53 PM
Hi , is it possible to build a
``inline class``
pool that returns same reference ? Related link : https://kotlinlang.slack.com/archives/C0B8Q383C/p1644805562640269 Play ground : https://pl.kotl.in/uBVYwgQgO?theme=darcula I am building a carousel-like Int , naming
``Three``
, which restrict any Int value to
``1..3``
. That is
``Three.of(1) == Three.of(4)``
,
``Three.of(0) == Three.of(3)``
. I use a prebuild  array to simulate caching , hoping they get the same reference
Copy code
``````private val array by lazy {
arrayOf(Three(1), Three(2), Three(3))
}``````
But it seems it doesn't work. When comparing reference
``===``
, it complains
``Identity equality for arguments of types Three and Three is forbidden``
, which is counter-intuitive .
r

Roukanken

02/14/2022, 3:14 PM
Why? This goes against very idea of value classes - value's class value is it's identity. If two values are equal, they are identical. When you declare class a value class, you are basically saying "Okay, this class has no identity beyond the data it holds", an identity operator on it doesn't make sense - if it existed, it would do exactly same thing as equals operator
That's from theory standpoint, from more practical one: Value (or Inline) classes can be inlined as compiler wishes. Now if you have an inlined
``x: Int``
and not inlined
``y: Three``
how would you compare they have same identity (when original code had
``x === y``
?) You can't - the only reason the inlining can be consistent is that this operation is invalid. Equals operator is easy to do:
``x == y``
in original code would just turn to
``x == y.value``
in inlined one.
🤔 1
y

Youssef Shoaib [MOD]

02/15/2022, 6:51 PM
For your
``Three``
class btw, it's probably best to use an enum instead with 3 values
s

smallufo

02/18/2022, 1:16 AM
It makes sense , thanks
2 Views