Порядковый номер Java, возвращающий -1?
Хорошо, сейчас я пишу код для проекта, над которым я работаю, и я решил, что Enum для хранения данных будет моим лучшим выбором. Но в первый раз в моей жизни enum.ordinal() возвращает -1?
Вот код:
DuelRules.Rules rule = DuelRules.Rules.values()[(buttonId - (buttonId < 29 ? 18 : 19))];
if (buttonId == 29) {
rule = DuelRules.Rules.POCKET;
}
System.out.println(rule + ", " + rule.ordinal());
rules.swapRule(player, other, rule);
reset(false);
Это утверждение здесь:
System.out.println(rule + ", " + rule.ordinal());
Он печатает правильное значение правила, но когда он печатает rule.ordinal(), он печатает -1?
Пример:
HAT, -1
Мой Enum:
public enum Rules {
HAT(5000, 1),
CAPE(5000, 2),
AMULET(5000, 4),
WEAPON(5000, 8),
BODY(5000, 16),
SHIELD(5000, 32),
LEG(5000, 128),
GLOVE(5000, 512),
BOOT(5000, 1024),
RING(5000, 4096),
ARROW(5000, 8192),
POCKET(17837, 1),
FORFEIT(4989),
MOVEMENT(4990),
RANGE(4991),
MELEE(4992),
MAGIC(4993),
DRINKS(4994),
FOOD(4995),
PRAYER(4996),
OBSTACLES(4997),
FUN_WEAPONS(4998),
NO_ABILITIES(4999),
SUMMONING(5001);
private final int varbitId;
private final int value;
private Rules(int id, int... value) {
this.varbitId = id;
this.value = value.length > 0 ? value[0] : 0;
}
}
Обратите внимание, что enum находится внутри другого класса, но не уверен, что это может повлиять на результат. Спасибо за вашу помощь, я полностью потерян с этим.
РЕДАКТИРОВАТЬ: После более подробной проверки я обнаружил, что порядковый номер изменяется, передавая его в качестве аргумента?
Скриншот консоли:
Код:
} else if (buttonId >= 18 && buttonId <= 42) {
DuelRules.Rules rule = DuelRules.Rules.values()[(buttonId - (buttonId < 29 ? 18 : 19))];
System.out.println("Point one: "+rule + ", " + rule.ordinal());
rules.swapRule(player, other, rule);
getDuel(other).rules.setRules(player, other, rules
.rules);
reset(false);
sendFlash(interfaceId, buttonId);
}
Там, где он печатает пункт один, правило и его.ordinal правильно, в этом случае ПРЕПЯТСТВИЯ, 20
Но где он передает параметры правила в rules.swapRule, он меняет порядковый номер на -1?
public boolean swapRule(Player player, Player other, Rules rule) {
System.out.println("Point 2(swapRule): " + rule + ", " + rule.ordinal());
}
Что вызывает изменение параметров правила при передаче в качестве аргумента?
2 ответа
Ваш подход побеждает явную цель использования перечислителя. Вместо того, чтобы манипулировать индексами, вы можете использовать Enum напрямую, как это
button.setActionCommand (Rules.HAT.toString ());
Затем в вашем ActoinListener вы можете определить, какая кнопка была нажата с помощью этого
public void actionPerformed (ActionEvent e) {
if (Rule.valueOf (e.getActionCommand()) == Rules.HAT) {
//HAT related button was called, process it
}
}
Вы можете получить этот результат путем отражения:
import java.lang.reflect.Field;
public class Main {
enum Fruit { APPLE }
public static void main(String[] args) {
try {
Field field = Fruit.class.getSuperclass().getDeclaredField("ordinal");
field.setAccessible(true);
field.set(Fruit.APPLE, -1);
} catch (Exception e) {
}
System.out.println(Fruit.APPLE + ", " + Fruit.APPLE.ordinal());
}
}
Однако я сомневаюсь, что кто-то мог сделать это по ошибке.