Помимо использования описанных выше методов, которые добавляют поле к перечисляемому типу, вы также можете использовать подход, основанный только на методах, и полиморфизм. Это больше "ООП стиль", но я бы не сказал, что это обязательно лучше.
К сожалению, вам нужно определить интерфейс:
public interface AnimalTraits {
default boolean isAmphibian() { return false; };
default boolean isReptile() { return false; };
default boolean isMammal() { return false; };
}
Но тогда вы сможете реализовать интерфейс в каждом из ваших элементов перечисления:
public enum Animal implements AnimalTraits {
ELEPHANT { @Override public boolean isMammal() { return true; } },
GIRAFFE { @Override public boolean isMammal() { return true; } },
TURTLE { @Override public boolean isReptile() { return true; } },
SNAKE { @Override public boolean isReptile() { return true; } },
FROG { @Override public boolean isAmphibian() { return true; } }
}
Обратите внимание, что я использую реализации по умолчанию в интерфейсе, чтобы сократить количество набираемого текста в перечислении.
Относительно необходимости интерфейса: я пытался добавить методы в интерфейс, поскольку абстрактные методы в верхней части enum и Eclipse, казалось, позволяли это, и настаивал на реализации в элементах enum, но затем не смог скомпилировать их должным образом. Похоже, что это возможно без интерфейса, но, возможно, это еще не реализовано в компиляторе.
Примечание: требуется Java 8 или выше.