https://unsplash.com/@christopher__burns

C# for the Java Developer: Enums

Enums is a very common concept. It exists, of course, in Java and C# as well. However, Java and C# enums do not have the same capabilities. This blog post aims to show their differences.

In Java, enums are very much like regular classes: they can implement interfaces and have methods. However, they cannot inherit other classes or be explicitly instantiated. They can be viewed as final classes (or sealed classes in C#) that already inherit the virtual “enum” class, have only private constructor(s) and a set of pre-defined instances (the values of the enum).

For instance, let’s take the example of the HTTP status codes. In Java, it is possible to write this code:

enum HttpStatus implements Comparable<HttpStatus> {
    OK(200), SERVER_ERROR(500), NOT_FOUND(404);

    private final int code;

    HttpStatus(int code) {
        this.code = code;
    }

    // This is a regular instance method
    int code() {
        return code;
    }

    // This is the implementation of the Comparable interface
    @Override
    int compareTo(HttpStatus o) {
        // Http statuses will be sorted by status code
        return Integer.compare(code, o.code);
    }
}
HttpStatus status = HttpStatus.OK;

// The 'code' method can be invoked like any other method
int code = status.code();

In C#, enums are just integers in disguise. The previous snippet can be simulated in C# only because the code attribute happens to be an int. Otherwise, it would be very complex to have the same behaviour:

enum HttpStatus {
    // int value of the enum can be forced to a specific value
    OK = 200,
    NOT_FOUND = 404,
    SERVER_ERROR = 500
}
HttpStatus status = HttpStatus.OK;

// The enum can be casted to an int to get its value
int code = (int) status;

To sum up, Java enums are much more powerful than their C# counterparts. I often use these features when I write Java code and I think I would miss them if I had to write C# code on a daily basis.

Comments