If Enums are an answer for getting rid of compile time constants , why did the language designers provide facility to let arbitrary methods and fields and implement arbitrary interfaces on Enums ? Those methods can never change the state of the Enum instances or can they ? If they are allowed to change the state , then the invariant of an Enum type ie some type that exports a few constants will break IMHO.
Share
Java enums are really just classes with some special treatment by the compiler and runtime. So yes, method calls on an enum instance can certainly change its state. I’m not sure what you mean with “then the invariant of an Enum type ie some type that exports a few constants will break”.
Who says enums can only be a bunch of constants? The essence of an enum type is that you have a predefined fixed number of instances which you can refer to by name – and Java enums implement that. But why would a language not be allowed to have enums that are more powerful than that?
If you don’t want the extra power, nobody forces you to use it. You can have Java enums without fields or methods, and they’ll behave pretty much exactly like C enums.