обзор 
  Перечисление в Java является более мощным, чем многие другие языки, что может привести к неожиданному использованию. 
В этой статье я расскажу об отдельных особенностях enum в Java и соберу их вместе, чтобы сформировать конечный автомат.
  Enum для класса Singleton и Utility 
  Вы можете использовать enum как Singleton или Utility очень просто. 
| 1 2 3 4 5 6 | enumSingleton {    INSTANCE;}enumUtility {    ; // no instances} | 
  Enum для реализации интерфейса 
  Вы также можете реализовать интерфейс в перечислении. 
| 01 02 03 04 05 06 07 08 09 10 | interfaceNamed {    publicString name();    publicintorder();}enumPlanets implementsNamed {    Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune;    // name() is implemented automagically.    publicintorder() { returnordinal()+1; }} | 
  Каждый экземпляр Enum — это отдельный подкласс 
  Вы можете переопределить поведение экземпляра.  Это эффективно дает экземпляру другой подкласс перечисления с его собственной реализацией. 
| 01 02 03 04 05 06 07 08 09 10 | // from http://download.oracle.com/javase/1,5.0/docs/guide/language/enums.htmlpublicenumOperation {  PLUS   { doubleeval(doublex, doubley) { returnx + y; } },  MINUS  { doubleeval(doublex, doubley) { returnx - y; } },  TIMES  { doubleeval(doublex, doubley) { returnx * y; } },  DIVIDE { doubleeval(doublex, doubley) { returnx / y; } };  // Do arithmetic op represented by this constant  abstractdoubleeval(doublex, doubley);} | 
  Использование перечисления в качестве конечного автомата 
  Что вы можете сделать со всеми этими методами, так это создать оператор на основе перечисления. 
   В этом коротком примере конечный автомат синтаксического анализатора обрабатывает необработанный XML из ByteBuffer.  Каждое состояние имеет свой собственный метод процесса, и если данных недостаточно, конечный автомат может вернуться для получения дополнительных данных.  Каждый переход между состояниями четко определен, и код для всех состояний находится в одном перечислении . 
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | interfaceContext {    ByteBuffer buffer();    State state();    voidstate(State state);}interfaceState {    /**       * @return true to keep processing, false to read more data.     */    booleanprocess(Context context);}enumStates implementsState {    XML {        publicbooleanprocess(Context context) {            if(context.buffer().remaining() < 16) returnfalse;            // read header            if(headerComplete)                context.state(States.ROOT);            returntrue;        }    }, ROOT {        publicbooleanprocess(Context context) {            if(context.buffer().remaining() < 8) returnfalse;            // read root tag            if(rootComplete)                context.state(States.IN_ROOT);            returntrue;        }    }}publicvoidprocess(Context context) {    socket.read(context.buffer());    while(context.state().process(context));} | 
Используя этот подход, можно написать синтаксический анализатор XML, который может обрабатывать пакеты за 10 микросекунд. Это так эффективно, как вам нужно в большинстве случаев.
Ссылка: Java Secret: Использование enum для создания конечного автомата от нашего партнера по JCG Питера Лоури из Vanilla Java .