enum made its way — belatedly — from C++.
As originally conceived, the C++ enum defined a set of sequential manifest constants from 0 to n, but it was quickly discovered that other variants were useful, including enums whose origins were non-zero and even had "holes" in them. Even bit patterns, on occasion.
Java built on this expanded concept and further extended the enum to be very class-like. The end result is much like what the Ada lamguage does, where you've defined a set of manifest constants which can be used in a type-safe and value-limited manner.
An enum, by definition orders its values in a repeatable enumeration sequence. So there are definite rules about retrieving those values.
Strictly speaking, then, enumeration values are distinct data types of their own. The fact that internally they might be specific integer values or map to strings is secondary.
Consequently, while you can certainly get clever with introspections and the like, the most basic way to map enum values to general values is simply to define a map as part of the enum (which can be an array) to fetch/be searched for those external mappings with corresponding access methods. And, in fact, I have had enums that mapped in multiple ways, so they had more than one set of mapping methods.