4

好的,所以我目前正在为我正在处理的项目编写一些代码,我决定使用 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

我的枚举:

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;
    }

}

请注意,该枚举在另一个类中,不确定这是否会影响结果。感谢您的帮助,我完全迷失了这个。

编辑:经过进一步审查,我发现通过将其作为参数传递来更改序数?

控制台截图:

代码:

        } 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 是正确的,在本例中为 OBSTACLES,20

但是它在 rules.swapRule 中传递规则参数的地方,它会将序数更改为 -1?

public boolean swapRule(Player player, Player other, Rules rule) {
    System.out.println("Point 2(swapRule): " + rule + ", " + rule.ordinal());
}

是什么导致规则参数在作为参数传递时发生变化?

4

2 回答 2

2

您的方法违背了使用枚举器的纯粹目的。您可以像这样直接使用枚举,而不是使用索引进行修改

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
    }
}
于 2014-12-16T05:39:52.667 回答
1

你可以通过反射得到这个结果:

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());
    }
}

但是我怀疑有人会错误地做到这一点。

于 2014-12-16T08:32:15.360 回答