Порядковый номер 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());
    }
}

Однако я сомневаюсь, что кто-то мог сделать это по ошибке.

Другие вопросы по тегам