Home / apex / apex-enum-patterns
apex-enum-patterns
Apex enum patterns — enum-based dispatch instead of string switching, ordinal stability, enum values in Custom Metadata, package-global enums, and the limitations (no methods on enum constants, no associated data). Covers `Enum.values()`, `valueOf(String)` failures, and the right way to map an enum to/from a picklist value. NOT for picklist-field design and value-set management — use admin/picklist-and-value-sets. NOT for reading picklist values at runtime via describe — use apex/apex-schema-describe.
Open the skill folder on GitHub
Apex Enum Patterns
Apex enums are simpler than Java enums — no constructors, no methods on enum constants, no per-value data — but they still beat unstructured strings for state-machine dispatch, message routing, and any "one of N exhaustive options" code path.
The mistakes follow a predictable pattern: people serialize enum values into Custom Metadata or a Long Text field, the picklist gets renamed, and Enum.valueOf(String) starts throwing System.NoSuchElementException in production. Or someone adds a new enum value and the switch on doesn't have a branch — Apex falls through silently because there's no compiler exhaustiveness check.
This skill covers the patterns that make enums useful in Apex without the foot-gun.
Recommended Workflow
- Decide if an enum is the right shape. If you have <2 values
or values change at runtime, use a Boolean or a Custom Metadata-driven string. Enums are for closed sets.
- Name the enum after intent, not type.
RenewalActionbeats
EnumType1. - Use
switch on <Enum>with awhen elsebranch that throwsa clear exception. This is the only way to surface a missed case at runtime when the enum gains a new value.
- Wrap
Enum.valueOf(String)in a safe converter that returnsa default or throws a typed exception with the offending input in the message.
- Document
globalvspublicin managed packages. Onceshipped, removing or renaming a
globalenum value is a breaking change. - **Write a test that asserts the enum's
values()matches theexpected set.** This is the cheapest exhaustiveness check Apex gives you.
When To Reach For An Enum
The right places: trigger-handler dispatch keys, message-routing discriminators, log-level enums, status machines that the app itself owns end-to-end. Anywhere the set of values is a property of the code, not the data, an enum is the cheaper, safer choice.
The wrong places: anything an admin should be able to add to. If adding a new "approval reason" should not require a deployment, do not put it in an enum. The enum becomes a maintenance ratchet that pulls every dispatcher into the release pipeline.
What This Skill Does Not Cover
- Picklist-field design — see
admin/picklist-design. - Custom Metadata as configuration store — see
apex/custom-metadata-types. - State machines with side effects — see
architect/state-machine-patterns.