Sexy, Chic , Powerful
Sexy and Chic because they produce elegant code by constraining the choices of what you can pass.
Powerful, because by limit your choices , actually increase the code effectiveness (it means the code you write today will work if reused 10 years later )
But , first things first…
What is an Enum type? 
They are classes that export one instance for each enumeration constant (think a public static final field ), or consider it as a generalization of singletons ( singleton as an single element enum)
What they Provide?:
- Compile-time Type Safety:
 Prevent typos and invalid parameters passing in compile-time checking and prevent errors like passing Null values that will fail in Run-time
- Make testing easier
 If enum is passed as parameter in a method, testing is easier for edge conditions, for example no need to write unit tests for invalid input
- They are Self-documented
 The set of choices for a parameter is finite and self-describing, so no need to write comments or documentation
- Can have methods and other fields 
 In Java doc , enum is defined as:
public abstract class Enum<E extends Enum<E>>
extends Object
implements Comparable<E>, Serializable
So you can add methods, fields and implement any behavior you want. **PS** An Enum cannot extend other Enum, all of them extend java.lang.Enum class and Java doesn’t supports multiple inheritance !
When to use them?
- When you need a set of constants that are known at compile time(e.g transaction statuses, planets , days of week , lipstick color codes )
- According to Bloch , a single-element enum type is the best way to implement a singleton.
- Use them to implement the Strategy design pattern
 In this case each enum or many enums can share a behavior.
 Let’s see the below example, the strategy is the ConnectType , enums INSTAGRAM, LINKEDIN, TINDER share the same way to connect, sending a PM, but PHONE and SKYPE follow a different approach.
public enum Networking {
    INSTAGRAM,LINKEDIN, TINDER,
    PHONE(ConnectType.LANDLINE), SKYPE(ConnectType.VoIP);
    private final ConnectType connectType;
    Networking() { this.connectType= ConnectType.TEXT; }
    Networking(ConnectType connectType) {
        this.connectType=connectType;
    }
    void connect(){
        connectType.connect();
    }
    private enum ConnectType {
        TEXT {
            @Override
            void connect() {
                System.out.print("Send a PM ..");
            }
        },
        VoIP {
            @Override
            void connect() {
                System.out.print(" Do a video call! ");
            }
        },
        LANDLINE {
            @Override
            void connect() {
                System.out.print("Classic and Vintage! ");
            }
        };
        abstract void connect();
    }
}