Skip to content

martin-hirsch/JavaStyleEnums

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JavaStyleEnums

A C# demonstration of the Java-style Enum (or "Smart Enum") pattern. Enums that carry behavior, not just values.

The Problem

Standard C# enums are glorified integers:

public enum DayEnum { Monday, Tuesday, ... }

They cannot hold methods or state. In Java, enums are full objects, and each constant can override methods. This project shows how to replicate that in C#.

The Solution*

*for everyone who doesn't want to introduce another NuGet package dependency.

Day is an abstract record with static singleton instances acting as the enum constants. It declares a DayEnum property that serves as a stable, serialization-friendly identity for each constant, useful for persistence, mapping, or switch expressions:

public abstract record Day
{
    public static readonly Day Monday    = new MondayDay();
    public static readonly Day Tuesday   = new TuesdayDay();
    // ...

    public abstract DayEnum DayEnum { get; }
    public abstract string TellItLikeItIs();
}

Each constant is a sealed record that implements both:

public sealed record MondayDay : Day
{
    public override DayEnum DayEnum => DayEnum.Monday;
    public override string TellItLikeItIs() => "Mondays are bad.";
}

Usage reads exactly like a regular enum, but answers polymorphically without a switch:

Day today = Day.Monday;
Console.WriteLine(today.TellItLikeItIs()); // "Mondays are bad."

DayMapper shows DayEnum in action for the reverse mapping (Day -> DayOfWeek):

public DayOfWeek Map(Day day)
    {
        return day.DayEnum switch
        {
            DayEnum.Monday => DayOfWeek.Monday,
            DayEnum.Tuesday => DayOfWeek.Tuesday,
            // ...
        };
    }

In short: Day is the rich behavior object; DayEnum is its lightweight, portable name tag.

About

A C# demonstration of the Java-style Enum (or "Smart Enum") pattern.

Resources

Stars

Watchers

Forks

Contributors

Languages