DEV Community

loading...

Discussion on: Make impossible states impossible - Kotlin edition

Collapse
le0nidas profile image
le0nidas

That is a clever usage of interfaces!

I recently had to deal with a similar case while refactoring some legacy code.
My approach to create valid entities was achieved via factory functions. In a nutshell you can have a

fun UserName(value: String): UserName? {
    return if (value.isEmpty()) null else UserName(value)
}

which tricks the dev to think that is using a constructor but at the same time keeps everything valid and readable.

If you are interested I wrote a blog post here.

Collapse
psfeng profile image
Pin-Sho Feng Author • Edited

Interesting blog post, thanks! I like that increasingly more people are aware of this problem :)

As for the suggestion, I'd advise against doing it that way because it goes against the conventions:

  • Naming: function names should start with a lowercase letter, see here.
  • From outside it looks like a constructor and I wouldn't expect a constructor to return null.

My 2 cents.

Collapse
le0nidas profile image
le0nidas

Both arguments are valid. Especially the second one didn't even crossed my mind. Thank you!