Shradha Chougule
Shradha Chougule

Reputation: 3

Avoid multiple if-else conditions for different enum values in Java

I have 6 values in the enum and using 6 if-else is really a bad practice. Can we implement this in any better way? Below is my scenario :

ExampleEnum value = getEnumValue();

if(ExampleEnum.A == value){
   doA();
}else if(ExampleEnum.B == value){
   doB();
}else if(ExampleEnum.C == value){
   doC();
}else if(ExampleEnum.D == value){
   doD();
}else if(ExampleEnum.E == value){
   doE();
}else if(ExampleEnum.F == value){
   doF();
}

I was thinking of switch, but is is not making much difference also i need to return a boolean value inside doA() depending on certain parameters.

Thanks in advance.

Upvotes: 0

Views: 1570

Answers (3)

MC Emperor
MC Emperor

Reputation: 22977

You have a few options:

A chain of else-ifs

Leave your code as-is. Hard to read and write.

Switch

switch (value) {
    case A:
        doA();
        break;
    case B:
        doB();
        break;
    case C:
        doC();
        break;
    case D:
        doD();
        break;
    case E:
        doE();
        break;
    case F:
        doF();
        break;
}

Note that this is the classic switch. If you have access to newer Java versions, it is probably possible to get rid of the breaks.

EnumMap

You can also create an EnumMap:

EnumMap<ExampleEnum, Runnable> enumMap = new EnumMap<>(Map.<ExampleEnum, Runnable>of(
    ExampleEnum.A, Main::doA, // 'Main', or wherever your do* methods are.
    ExampleEnum.B, Main::doB,
    ExampleEnum.C, Main::doC, // I'm using method references. But you could
    ExampleEnum.D, Main::doD, // also use lambda expressions: '() -> doD()'.
    ExampleEnum.E, Main::doE,
    ExampleEnum.F, Main::doF
));

ExampleEnum value = getEnumValue();
enumMap.get(value).run();

Upvotes: 1

hertzsprung
hertzsprung

Reputation: 9893

If you want to use a switch statement and you're on Java 12 or newer, consider using extended switch expressions that avoid the pitfalls of break statements:

switch (value) {
    case A -> doA();
    case B -> doB();
    case C -> doC();
    case D -> doD();
    case E -> doE();
    case F -> doF();
}

Upvotes: 1

Cyril G.
Cyril G.

Reputation: 2017

You can add the do method inside the enum.

public enum ExampleEnum {
    A {
        public void doIt() { ... }
    },
    B {
        public void doIt() { ... }
    },
    ...

    abstract public void doIt();

}

ExampleEnum value = getEnumValue();
if (value != null) {
    value.doIt();
}

Upvotes: 0

Related Questions