With the recent release of Kotlin version 1.5 the value types have exited the experimental stage. This means we can now use type driven development approach without the fear of the overhead that wrapping in a custom classes caused. The value class works by inlining the wrapped value during compilation. From now one we will be able to safety pass values around without the overhead of new instance creation. Example below:
@JvmInline
value class UserId(val value: String)
data class User(val userId: UserId)
Unfortunately we still need to use an annotation and probably will needed it for the time being as stated:
In Kotlin/Native and Kotlin/JS, because of the closed-world model, value-based classes with single read-only property are inline classes. In Kotlin/JVM we require the annotation for inline classes, since we are going to support value-based classes, which are a superset of inline classes, and they are binary incompatible with inline classes. Thus, adding and removing the annotation will be a breaking change.
KEEP
There are also some problems with language interoperability. For example, Groovy. The language does not see those types. In Spock tests we will have to use raw types:
def user = new User("someUserId")
This will cause a lot of headaches during refactors (as is often the case with Groovy, but that is a different topic).
From Java perspective we will (hopefully) have value types from Project Valhalla but since there is no known release date as of today, Kotlin release is very welcome. Especially for someone that firmly believes in type driven development.