Enumerated Types in Java 5

Java 5 (and hence AspectJ 5) provides explicit support for enumerated types. In the simplest case, you can declare an enumerated type as follows:

public enum ProgrammingLanguages {
  COBOL, C, JAVA, ASPECTJ
}

Enumerated types are just classes, and they can contain method and field declarations, and may implement interfaces. Enums may only have private constructors, and may not be extended.

Enumerated types in Java 5 all implicitly extend the type java.lang.Enum. It is illegal to explicitly declare a subtype of this class.

Enumerated Types in AspectJ 5

AspectJ 5 supports the declaration of enumerated types just as Java 5 does. Because of the special restrictions Java 5 places around enumerated types, AspectJ makes the following additional restrictions:

  • You cannot use declare parents to change the super type of an enum.

  • You cannot use declare parents to declare java.lang.Enum as the parent of any type.

  • You cannot make inter-type constructor declarations on an enum.

  • You cannot extend the set of values in an enum via any ITD-like construct.

  • You cannot make inter-type method or field declarations on an enum.

  • You cannot use declare parents to make an enum type implement an interface.

In theory, the last of these two items could be supported. However, AspectJ 5 follows the simple rule that an enum type cannot be the target of an inter-type declaration or declare parents statement. This position may be relaxed in a future version of AspectJ.

If an enum is named explicitly as the target of a declare parents statement, a compilation error will result. If an enumerated type is matched by a non-explicit type pattern used in a declare parents statement it will be ignored (and an XLint warning issued).