Despina Papatheodorou
2 min readNov 19, 2020

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 {

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

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

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

abstract void connect();