Marek S
Marek S

Reputation: 109

Return correct enum without using if

I have task to change this if:

if (userDecision.equalsIgnoreCase("D")) {
    return DirectoriesActivity.DELETE;
} else if (userDecision.equalsIgnoreCase("R")) {
    return DirectoriesActivity.REPLACE;
} else {
    return DirectoriesActivity.ADD_NEW_CONTENTS;
}

On something what will return just enum without using if. I have to use some enum properties but I don't know which one :/ Here is my enum:

public enum DirectoriesActivity {
    DELETE,
    REPLACE,
    ADD_NEW_CONTENTS;
}

I tried to do something like this:

public enum DirectoriesActivity {
    DELETE ("D"),
    REPLACE ("R"),
    ADD_NEW_CONTENTS ("A");

    private String directoriesActivityCode;
    private DirectoriesActivity(String directoriesActivityCode)    {
        this.directoriesActivityCode = directoriesActivityCode;
    }

    public DirectoriesActivity getEnum(String x){
        //no idea what to do here
    }
}

Or maybe somebody have some other idea?

Upvotes: 0

Views: 138

Answers (3)

wjans
wjans

Reputation: 10115

How about this:

public enum DirectoriesActivity {
    DELETE ("D"),
    REPLACE ("R"),
    ADD_NEW_CONTENTS ("A");

    private String directoriesActivityCode;

    private DirectoriesActivity(String directoriesActivityCode)    {
        this.directoriesActivityCode = directoriesActivityCode;
    }    

    public DirectoriesActivity getEnum(String x){
        for (DirectoriesActivity directoriesActivity : values()) {
            if (directoriesActivity.directoriesActivityCode.equals(x)) {
                return directoriesActivity;
            }
        }
        throw new IllegalArgumentException("Unknown value " + x);
    }
}    

Or in case you are using Java 8

return Arrays.stream(DirectoriesActivity.values())
            .filter(directoriesActivity -> directoriesActivity.directoriesActivityCode.equals(userDecision))
            .findFirst()
            .orElseThrow(() -> new IllegalArgumentException("Unknown value " + userDecision));

Important side note here is that this solution is performing a lot worse than the solution provided by Peter. But as long as performance is not an issue, I'd prefer a solution like this.

Upvotes: 0

sibnick
sibnick

Reputation: 4305

If you can change enum names to D, R, A then you can use built-in feature:

public enum DirectoriesActivity {D,R,A}
DirectoriesActivity activity = DirectoriesActivity.valueOf("D");

valueOf throws IllegalArgumentException if string is not match.

Upvotes: 0

Peter Lawrey
Peter Lawrey

Reputation: 533492

You can add a Map lookup.

static Map<String, DirectoriesActivity> lookup = new HashMap<>();

static {
    // iterate over all the values and 
    // put the value we want to lookup as the key to the map.
    for(DirectoriesActivity da: values())
        lookup.put(da.directoriesActivitCode, da);
}

public static DirectoriesActivity lookup(String s) {
    // lookup the map we built in the static block.
    return s == null ? null : lookup.get(s.toUppercase());
}

This way you can add as many codes as you want without having to change the code.

Upvotes: 4

Related Questions