How to get an enum value from a string value in Java?

To retrieve an enum value from a string in Java, follow these steps:

1. Use valueOf for Exact Name Matching

If the string exactly matches the enum constant’s name (case-sensitive), use the built-in valueOf method:

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

// Example usage:
String input = "MONDAY";
Day day = Day.valueOf(input); // Returns Day.MONDAY

Note:

  • Throws IllegalArgumentException if the string doesn’t match any enum constant.
  • Case-sensitive (e.g., “monday” will fail).

2. Custom Lookup for Non-Name Fields

If the string maps to a custom field (e.g., a code or label), implement a static lookup method:

public enum Status {
    OPEN("open"),
    CLOSED("closed");

    private final String code;

    Status(String code) {
        this.code = code;
    }

    public static Status fromCode(String code) {
        for (Status status : Status.values()) {
            if (status.code.equalsIgnoreCase(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException("Invalid code: " + code);
    }
}

// Example usage:
String input = "OPEN";
Status status = Status.fromCode(input); // Returns Status.OPEN

3. Case-Insensitive Lookup for Enum Names

To handle case-insensitive name matching, loop through the enum values:

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    public static Day fromNameIgnoreCase(String name) {
        for (Day day : Day.values()) {
            if (day.name().equalsIgnoreCase(name)) {
                return day;
            }
        }
        throw new IllegalArgumentException("Invalid name: " + name);
    }
}

// Example usage:
String input = "monday";
Day day = Day.fromNameIgnoreCase(input); // Returns Day.MONDAY

4. Return Optional for Safe Handling

Return Optional to avoid exceptions and handle missing values gracefully:

public enum Day {
    // ... enum constants ...

    public static Optional<Day> fromName(String name) {
        return Arrays.stream(Day.values())
            .filter(day -> day.name().equalsIgnoreCase(name))
            .findFirst();
    }
}

// Example usage:
Optional<Day> day = Day.fromName("monday");
day.ifPresentOrElse(
    d -> System.out.println("Found: " + d),
    () -> System.out.println("Not found")
);

5. Handle Invalid Input

Always validate input to prevent exceptions:

public static Day safeValueOf(String input) {
    try {
        return Day.valueOf(input.toUpperCase());
    } catch (IllegalArgumentException e) {
        return Day.MONDAY; // Default value
    }
}

Key Takeaways

ScenarioSolution
Exact name match (case-sensitive)Enum.valueOf()
Custom field lookupStatic method with loop/stream
Case-insensitive name matchLoop and compare with equalsIgnoreCase
Safe handlingReturn Optional or default value

By choosing the appropriate method, you can reliably convert strings to enum values in Java.

Leave a Reply

Your email address will not be published. Required fields are marked *