Hello,
D has intrigued me for a while, and I thought I would finally read up on it! I've been reading "Programming in D" by Ali Çehreli and I've been thinking about how I can use the language in a side project I'm working on, porting it from java to D. One of the uncommonly-used features of java that I like is how enums can be full classes (though I don't like that there's no option to use enums as e.g. regular ints). This allows several benefits, such as the ability to use them in switch statements like regular enums, the full set of objects is known at compile time, all objects are immutable, it's impossible to accidentally or purposefully create new objects of that type, etc...

For example (in java), if I wanted to have an enum that describes all the white keys on a piano keyboard and have members that describe the number of half-steps to the next white key and to the previous white key, I can define an enum (the "id" or enum value is implicitly defined so it doesn't have to be explicitly written in the definition):

enum WhiteKey
{
    A(2,2),
    B(2,1),
    C(1,2),
    D(2,2),
    E(2,1),
    F(1,2),
    G(2,2);

    private final int halfStepsToNext;
    private final int halfStepsToPrevious;

    WhiteKey(int halfStepsPrevious, int halfStepsNext)
    {
        this.halfStepsToPrevious = halfStepsPrevious;
        this.halfStepsToNext = halfStepsNext;
    }
}

From what I've read and seen, in D all enums have forced to integral types. Is it possible to do the above in D and I have just missed it? I can think of a few ways around it (such as statically create and define a bunch of WhiteKey structs, ...), but none are as clean as the above. If this isn't something supported, is it on a roadmap of wanted features?

Thanks! I'm looking forward to really getting to know the language.

Reply via email to