How can I compare an enum directly to a string in EK9?
← Enumerations · Ref: Q221
EK9 enumerations support 7 string-parameter comparison operators: ==, <>, <, >, <=, >=, and <=>. You can also construct an enum from a string safely.
DIRECT STRING COMPARISON
Compare any enum variable directly to a string literal: season == "Spring" returns true if the enum holds Spring. No .name(), no .toString(), no conversion needed.
ALL SEVEN OPERATORS
All comparison operators work with strings: ==, <>, <, >, <=, >=, <=>. Ordering follows declaration order, just like enum-vs-enum comparison.
SAFE STRING CONSTRUCTION
Season("Autumn") returns a set enum if the string matches a declared value. Season("Monsoon") returns an unset enum, not an exception.
GUARD EXPRESSION PATTERN
Use guard expressions for the cleanest pattern: 'if parsed <- Season("Summer")' only enters the block when the enum is set. Combines construction and checking in one line.
NO EXCEPTIONS
In Java, valueOf("bad") throws IllegalArgumentException. In Python, Enum["bad"] raises KeyError. In EK9, you simply get unset. No try-catch needed, just use a guard expression.
See Q219 for all auto-generated operators. See Q222 for unset propagation. See Q99 for basic enumeration.
Example
defines module qa.enums.stringcompare defines type Season Spring Summer Autumn Winter defines program EnumStringCompareDemo() stdout <- Stdout() season <- Season.Spring // === DIRECT STRING COMPARISON === springName <- "Spring" stdout.println(`Equals Spring: ${season == springName}`) stdout.println(`Not Winter: ${season <> "Winter"}`) // === ALL SEVEN STRING COMPARISON OPERATORS === stdout.println(`Less than Summer: ${season < "Summer"}`) stdout.println(`Greater than Autumn: ${season > "Autumn"}`) stdout.println(`Leq Spring: ${season <= springName}`) stdout.println(`Geq Spring: ${season >= springName}`) stdout.println(`Compare to Winter: ${season <=> "Winter"}`) // === SAFE STRING CONSTRUCTION === valid <- Season("Autumn") stdout.println(`Valid: ${valid}, isSet: ${valid?}`) invalid <- Season("Monsoon") stdout.println(`Invalid isSet: ${invalid?}`) // === GUARD EXPRESSION WITH STRING CONSTRUCTION === if parsed <- Season("Summer") stdout.println(`Parsed: ${parsed}`) if missing <- Season("Rainy") stdout.println("This will not print")
Common mistakes
E50060 — EK9 enumerations do not have a 'name()' method like Java enums. Use the == operator directly to compare an enum to a string. All seven comparison operators work with String arguments natively. See ek9 -h E50060 for details.
Incorrect:
season.name() == springName
Correct:
season == springName
Other ways to ask this
- Can I use == to compare an enum to a string in EK9?
- How does string comparison work with EK9 enumerations?
- How do I construct an enum from a string safely in EK9?
Coming from another language?
Java: valueOf() throws IllegalArgumentException for invalid strings, name() and toString() for conversion, no direct string comparison operators. Python: Enum["name"] raises KeyError, must wrap in try/except. Rust: from_str requires implementing or deriving FromStr trait, returns Result. Go: manual string matching with switch or map lookup. C#: Enum.Parse() throws ArgumentException, Enum.TryParse() exists but returns bool. Kotlin: valueOf() throws IllegalArgumentException, entries.find{} for safe lookup. EK9: direct == comparison, safe string construction returns unset not exception.
Keywords: migrate, exception, compare, name, direct, comparison, match, convert, enum, string, enumeration, safe