Enums
Create type-safe named constants with enums.
Enums (enumerations) are a way to define a set of named constants. They provide type safety and make code more readable by using meaningful names instead of magic numbers or strings.
What are Enums?
Section titled “What are Enums?”An enum is a special type that represents a fixed set of constants. Instead of using arbitrary numbers or strings, enums allow you to use meaningful names.
Why Use Enums?
Section titled “Why Use Enums?”- Type Safety - Prevents invalid values
- Readability - Code is self-documenting
- Maintainability - Easy to update values in one place
- IDE Support - Better autocomplete and refactoring
Python Enums
Section titled “Python Enums”Python provides the Enum class from the enum module:
from enum import Enum
class Status(Enum): """Simple enum for status values""" PENDING = "pending" ACTIVE = "active" INACTIVE = "inactive" DELETED = "deleted"
# Usageuser_status = Status.ACTIVEprint(user_status) # Status.ACTIVEprint(user_status.value) # "active"print(user_status.name) # "ACTIVE"
# Compare enum valuesif user_status == Status.ACTIVE: print("User is active")Status.ACTIVEactiveACTIVEUser is activepublic enum Status { PENDING("pending"), ACTIVE("active"), INACTIVE("inactive"), DELETED("deleted");
private final String value;
Status(String value) { this.value = value; }
public String getValue() { return value; }}
// Usagepublic class Main { public static void main(String[] args) { Status userStatus = Status.ACTIVE; System.out.println(userStatus); // ACTIVE System.out.println(userStatus.getValue()); // "active" System.out.println(userStatus.name()); // "ACTIVE"
// Compare enum values if (userStatus == Status.ACTIVE) { System.out.println("User is active"); } }}ACTIVEactiveACTIVEUser is activeEnum with Integer Values
Section titled “Enum with Integer Values”Enums can use integer values:
from enum import IntEnum
class Priority(IntEnum): """Enum with integer values""" LOW = 1 MEDIUM = 2 HIGH = 3 CRITICAL = 4
# Can compare with integerspriority = Priority.HIGHprint(priority) # Priority.HIGHprint(priority.value) # 3print(priority < Priority.CRITICAL) # Trueprint(priority == 3) # True (IntEnum allows this)Priority.HIGH3TrueTruepublic enum Priority { LOW(1), MEDIUM(2), HIGH(3), CRITICAL(4);
private final int value;
Priority(int value) { this.value = value; }
public int getValue() { return value; }
// Compare with integers public boolean isHigherThan(Priority other) { return this.value > other.value; }}
// Usagepublic class Main { public static void main(String[] args) { Priority priority = Priority.HIGH; System.out.println(priority); // HIGH System.out.println(priority.getValue()); // 3 System.out.println(priority.isHigherThan(Priority.MEDIUM)); // True }}HIGH3TrueEnum with Methods
Section titled “Enum with Methods”Enums can have methods and properties:
from enum import Enum
class Color(Enum): """Enum with methods""" RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0)
def __init__(self, r, g, b): self.r = r self.g = g self.b = b
def rgb(self): """Return RGB tuple""" return (self.r, self.g, self.b)
def hex(self): """Return hex color code""" return f"#{self.r:02x}{self.g:02x}{self.b:02x}"
def is_dark(self): """Check if color is dark""" return (self.r + self.g + self.b) < 400
# Usagecolor = Color.REDprint(color.rgb()) # (255, 0, 0)print(color.hex()) # #ff0000print(color.is_dark()) # False(255, 0, 0)#ff0000Falsepublic enum Color { RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255), YELLOW(255, 255, 0);
private final int r; private final int g; private final int b;
Color(int r, int g, int b) { this.r = r; this.g = g; this.b = b; }
// Return RGB array public int[] rgb() { return new int[]{r, g, b}; }
// Return hex color code public String hex() { return String.format("#%02x%02x%02x", r, g, b); }
// Check if color is dark public boolean isDark() { return (r + g + b) < 400; }}
// Usagepublic class Main { public static void main(String[] args) { Color color = Color.RED; System.out.println(java.util.Arrays.toString(color.rgb())); // [255, 0, 0] System.out.println(color.hex()); // #ff0000 System.out.println(color.isDark()); // false }}[255, 0, 0]#ff0000falseReal-World Example: Order Status
Section titled “Real-World Example: Order Status”from enum import Enum, auto
class OrderStatus(Enum): """Order status enum""" PENDING = auto() CONFIRMED = auto() PROCESSING = auto() SHIPPED = auto() DELIVERED = auto() CANCELLED = auto()
def can_cancel(self): """Check if order can be cancelled""" return self in [OrderStatus.PENDING, OrderStatus.CONFIRMED]
def is_completed(self): """Check if order is completed""" return self == OrderStatus.DELIVERED
def next_status(self): """Get next status in workflow""" status_flow = { OrderStatus.PENDING: OrderStatus.CONFIRMED, OrderStatus.CONFIRMED: OrderStatus.PROCESSING, OrderStatus.PROCESSING: OrderStatus.SHIPPED, OrderStatus.SHIPPED: OrderStatus.DELIVERED, } return status_flow.get(self)
class Order: def __init__(self, order_id: str): self.order_id = order_id self.status = OrderStatus.PENDING
def advance_status(self): """Move to next status""" next_status = self.status.next_status() if next_status: self.status = next_status return f"Order {self.order_id} moved to {self.status.name}" return f"Order {self.order_id} cannot advance from {self.status.name}"
def cancel(self): """Cancel order if possible""" if self.status.can_cancel(): self.status = OrderStatus.CANCELLED return f"Order {self.order_id} cancelled" return f"Order {self.order_id} cannot be cancelled from {self.status.name}"
# Usageorder = Order("ORD-001")print(order.status) # OrderStatus.PENDINGprint(order.advance_status()) # Order ORD-001 moved to CONFIRMEDprint(order.status) # OrderStatus.CONFIRMEDprint(order.cancel()) # Order ORD-001 cancelledOrderStatus.PENDINGOrder ORD-001 moved to CONFIRMEDOrderStatus.CONFIRMEDOrder ORD-001 cancelledpublic enum OrderStatus { PENDING, CONFIRMED, PROCESSING, SHIPPED, DELIVERED, CANCELLED;
public boolean canCancel() { return this == PENDING || this == CONFIRMED; }
public boolean isCompleted() { return this == DELIVERED; }
public OrderStatus nextStatus() { switch (this) { case PENDING: return CONFIRMED; case CONFIRMED: return PROCESSING; case PROCESSING: return SHIPPED; case SHIPPED: return DELIVERED; default: return null; } }}
public class Order { private String orderId; private OrderStatus status;
public Order(String orderId) { this.orderId = orderId; this.status = OrderStatus.PENDING; }
public OrderStatus getStatus() { return status; }
public String advanceStatus() { OrderStatus nextStatus = this.status.nextStatus(); if (nextStatus != null) { this.status = nextStatus; return String.format("Order %s moved to %s", orderId, status.name()); } return String.format("Order %s cannot advance from %s", orderId, status.name()); }
public String cancel() { if (this.status.canCancel()) { this.status = OrderStatus.CANCELLED; return String.format("Order %s cancelled", orderId); } return String.format("Order %s cannot be cancelled from %s", orderId, status.name()); }}
// Usagepublic class Main { public static void main(String[] args) { Order order = new Order("ORD-001"); System.out.println(order.getStatus()); // PENDING System.out.println(order.advanceStatus()); // Order ORD-001 moved to CONFIRMED System.out.println(order.getStatus()); // CONFIRMED System.out.println(order.cancel()); // Order ORD-001 cancelled }}PENDINGOrder ORD-001 moved to CONFIRMEDCONFIRMEDOrder ORD-001 cancelledEnum Iteration
Section titled “Enum Iteration”You can iterate over all enum values:
from enum import Enum
class Day(Enum): MONDAY = 1 TUESDAY = 2 WEDNESDAY = 3 THURSDAY = 4 FRIDAY = 5 SATURDAY = 6 SUNDAY = 7
# Iterate over all enum valuesfor day in Day: print(f"{day.name}: {day.value}")
# Check if value existsprint(Day.MONDAY in Day) # Trueprint(Day(1) == Day.MONDAY) # TrueMONDAY: 1TUESDAY: 2WEDNESDAY: 3THURSDAY: 4FRIDAY: 5SATURDAY: 6SUNDAY: 7TrueTruepublic enum Day { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6), SUNDAY(7);
private final int value;
Day(int value) { this.value = value; }
public int getValue() { return value; }}
// Usagepublic class Main { public static void main(String[] args) { // Iterate over all enum values for (Day day : Day.values()) { System.out.println(day.name() + ": " + day.getValue()); }
// Check if value exists System.out.println(Day.MONDAY == Day.valueOf("MONDAY")); // true }}MONDAY: 1TUESDAY: 2WEDNESDAY: 3THURSDAY: 4FRIDAY: 5SATURDAY: 6SUNDAY: 7trueVisual Representation
Section titled “Visual Representation”Key Takeaways
Section titled “Key Takeaways”When to Use Enums
Section titled “When to Use Enums”Use enums when:
- You have a fixed set of related constants
- You want type safety (prevent invalid values)
- You need self-documenting code
- Values won’t change frequently
- You want better IDE support
Examples:
- Status values (PENDING, ACTIVE, INACTIVE)
- Days of the week
- Colors
- Priority levels
- Error codes
- Configuration options