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 {

    PHONE(ConnectType.LANDLINE), SKYPE(ConnectType.VoIP);

    private final ConnectType connectType;
    Networking() { this.connectType= ConnectType.TEXT; }
    Networking(ConnectType connectType) {

    void connect(){

    private enum ConnectType {

        TEXT {
            void connect() {
                System.out.print("Send a PM ..");

        VoIP {
            void connect() {
                System.out.print(" Do a video call! ");

        LANDLINE {
            void connect() {
                System.out.print("Classic and Vintage! ");

        abstract void connect();