Java Enum
- An enumerated type is a type whose legal values consist of a fixed set of constants
- An enum type is a subclass of java.Lang.Enum. An enum cannot extend any other class.
- effectively static and final
- enum implements Comparable and Serializable.
- we can add instance fields/methods into enum
- its valueOf(String) method translates a constant’s name into the constant itself.
- Avoid use and return mutable field
Item 35: Use instance fields instead of ordinals
- Don’t rely on the ordinal or the order of elements in values
- it’s not a contract, and may change
- If needed, use an int field to declare the contract explicitly.
- if the order matters, or should not change, add tests to guarantee it.
assertThat(EnumSet.allOf(MyEnum.class)).containsExactly(EnumA, EnumB, ...)
Use EnumSet
- Use
EnumSet.of(EnumA, EnumB)
to create a set to store enum values.- It provides better performance compared with
HashSet<MyEnum>
- Use
Set<MyEnum>
as the interface, only use EnumSet when create the set.
Implement interface
public enum java.nio.file.LinkOption implements OpenOption, CopyOption {
NOFOLLOW_LINKS;
private LinkOption() {
}
}
public enum StandardOpenOption implements OpenOption {
READ,
WRITE,
APPEND,
TRUNCATE_EXISTING,
CREATE,
CREATE_NEW,
DELETE_ON_CLOSE,
SPARSE,
SYNC,
DSYNC;
private StandardOpenOption() {
}
}
Use enum for Singleton class
- This enum will implement an interface, use the interface when needed.
- We can mock the enum where ever the interface has been used.
Prefer equals() over ==
- EqualsIncompatibleType can detect an equality test between objects with incompatible types always returns false.
Add abstract methods(constant-specific method implementations) to enum
- each enum constant (including added in the future) will have to implement this method which guarantees that all cases are covered
Create an enum with Case Insensitive String
Misc Tips about Enum