How to do reverse lookup enum constant by value in Kotlin
This is a neat trick I discovered recently
enums are a very useful concept in programming and allow us to define constant values which can easily hold grouped data and even declare members
I use them heavily in my automation code to define constant values and they work very well when we have the define different branches in
when clause in kotlin to maybe perform different sort of actions
A common use case
One common use case for me is when I want to do enum constant lookup using its value. For example, I might declare different configurations for my tests and based on these values, I might want to take different actions, trigger some flows or perform some assertions
Let’s understand this with an example
In the above example, we have defined an enum class called
Mouses which has all different mouses and a short brand name for each.
If we want to get the enum constant value which has the value = “logi” then we can write a simple
foreach loop in kotlin to iterate over all the values and if the desired value is found (Ln 17 - 21) then assign it to the temporary enum variable (Ln 15)
Fair and simple enough right.
However, we would have to write this simple logic again and again for all the different enum constants that we declare.
A slightly better way using companion objects
The above code gets the job done, however, this could be written in a slightly more elegant way.
Below is the updated code
Let’s understand this:
Ln 10–13, we have declared a
companion object block to tie a member and a function to the enum class itself rather than its instance
Ln 11: We have a private immutable variable called
mapping which has the mapping of all the enum constants with their values. This is done by using
associateBy() which is called upon the
if we peek into the code for this function, we can see that it returns a
Map<K, T>, where K is the value of the enum constant and T is the actual constant itself
Finally, we have a
fromValue() method which accepts the enum constant value and returns the associated constant from the mapping variable. If for some reason the value does not match an existing constant, then we raise an exception like below (Ln 19) with the name of the class
java.lang.IllegalStateException: Look up failed for class experiments.MousesV1
Now we can easily call this
fromValue method on the enum constant and get the associated constant (Ln 18)
And that’s it. This has already made my code look much more concise and made it easier for me to use enums. Hopefully, you found this useful.
Until next time. Happy coding.
Polyglot Programmer at heart. Tester by profession. Love to use code to solve problems. Learning something new everyday. Know Python, Kotlin, Java and a bit of JS. View all posts by Gaurav
Originally published at https://automationhacks.io/ on December 11, 2019.