Подтвердить что ты не робот

Есть ли инкрементный оператор ++ для перечисления Java?

Можно ли реализовать оператор ++ для перечисления?

Я обрабатываю текущее состояние конечного автомата

4b9b3361

Ответ 1

Вы не можете "увеличивать" перечисление, но вы можете получить следующее перечисление:

// MyEnum e;
MyEnum next = MyEnum.values()[e.ordinal() + 1];

Но лучше было бы создать метод экземпляра в вашем перечислении.

Обратите внимание, как обрабатывается следующее значение проблемы для последнего экземпляра enum, для которого нет "следующего" экземпляра:

public enum MyEnum {

    Alpha,
    Bravo,
    Charlie {
        @Override
        public MyEnum next() {
            return null; // see below for options for this line
        };
    };

    public MyEnum next() {
        // No bounds checking required here, because the last instance overrides
        return values()[ordinal() + 1];
    }
}

Итак, вы можете сделать это:

// MyEnum e;
e = e.next();

Разумный выбор, который вы используете для реализации метода next(), включает:

  • return null; // there is no "next"
  • return this; // capped at the last instance
  • return values()[0]; // rollover to the first
  • throw new RuntimeException(); // or a subclass like NoSuchElementException

Переопределение метода позволяет избежать потенциальной стоимости генерации массива values() для проверки его длины. Например, реализация для next(), где последний экземпляр не переопределяет, может быть:

public MyEnum next() {
    if (ordinal() == values().length - 1)
        throw new NoSuchElementException();
    return values()[ordinal() + 1];
}

Здесь оба ordinal() и values() (обычно) вызываются дважды, что будет стоить больше, чем вышеперечисленный вариант выше.

Ответ 2

Нет. Java не поддерживает настраиваемую перегрузку оператора для любого пользовательского типа, включая перечисления.

Однако вы можете определить метод в классе enum, который вернул следующий счетчик.