So, instead of taking arguments of the enum type, your methods could accept any implementation of the interface, and in particular, provide the default stuff by having the enum constants implement whatever is necessary.

when using ordinal values. For this reason, the serialization machinery uses the constant's name instead of its position when serializing enum values.

So:

Type.X + 1

would be

Enum.values()[Enum.X.ordinal() + 1]

and the switch could be modelled using interfaces implemented by the enum itself (you can use enums in switch statements in Java, but often, making the enum implement the necessary code yields more maintainable code)

Yeah that's pretty much exactly what I had. Unfortunately enum.values()[LAST.ordinal() + 1] will be out of bounds. I need something like an enum with "expanding" values.
–
ShaunOct 5 '10 at 22:40

2

@Shaun. See edit. Use an interface instead of the enum value, and allow (client code? whatsoever) to provide extensions by providing new implementations of that interface. The enums are still handy for implementing a limited range of default behaviour.
–
DirkOct 5 '10 at 22:42