#safeValueOf was implemented in the enum to distinguish it from #valueOf (provided by the base enum class to turn a string to an enum instance). #safeValueOf was not throwing if the value was not recognized. If we get away from enum, I'd drop the static #safeValueOf, I personnally avoid statics whereever I can. Furthermore we'd end up having similar code in the constructor and in the #safeValueOf