A small note on software changes and types

C, C++ and Java are strongly typed languages. Types are used so that a compiler can at compile-time check whether certain assignments make sense. Enums are type definitions - otherwise the compiler could not check the validity of an assignment to an enum declared variable. This is convenient and prevents stupid bugs. But the downside of this is that those enum type definitions become public visible - they are part of what is called in C++ or Java the INTERFACE of a class or module. And the consequence is that if you add another constant to an enum definition, this IS AN INTERFACE CHANGE and usually requires that ALL source code that knows (depends from) this interface needs to get recompiled. If you expect frequent additions to your enum types better use simple strings. This trades compile time security against runtime flexibility.