Как объяснил ответ bij @MarkBramnik, основное использование - определение методов в самом типе перечисления, а затем предоставление каждому значению перечисления собственной реализации для него.
Как вы сами определили, еще один solid вариант использования - использовать это для предоставления настраиваемой реализации для каждого значения перечисления для унаследованных методов. Обратите внимание, что вы не ограничены только вещами из java.lang.Object
- перечисления могут реализовывать интерфейсы!
public interface SoundSource {
void play();
}
public enum Animal implements SoundSource {
DOG {
@Override public void play() {
AudioSystem.play("woof.mp3");
}
}
}
, например.
EDIT: ** Хотя это звучит хорошо, на самом деле она не работает в java - оставляя ответ как есть, но воспринимайте его как функцию «было бы неплохо» **
Эта функция также полезна, потому что она позволяет перечислять значения служат дампом хранилища для методов, которые go концепт. Например:
enum Animal {
DOG,
CAT {
public void doCatThings() { ... }
}
}
Это в основном проблема с пространством имен: если у вас есть метод, который относится к кошкам как концепции, а не к другим животным, вам нужно поместить его где-нибудь . Вы можете сделать class CatUtils { public static void doCatThings() {} }
, если хотите, но класс Utils
- это немного запах кода. По крайней мере, это трудно обнаружить. Более удобное место для размещения таких служебных методов, , если у вас уже есть перечисление, выделенное для этой концепции, находится в самом значении перечисления; тогда вы можете позвонить Animal.CAT.doCatThings();
вместо CatUtils.doCatThings();
, что немного лучше.