Можно ли реализовать оператор ++
для перечисления?
Есть ли инкрементный оператор ++ для перечисления Java?
Ответ 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, который вернул следующий счетчик.