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

}

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

ポイント 1 が表示されている場合、ルールとその序数は正しく、この場合は OBSTACLES, 20 です。

しかし、rules.swapRule でルール パラメータを渡す場所では、序数が -1 に変更されるのでしょうか。

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

引数として渡されると、Rule パラメーターが変更される原因は何ですか?

4

2 に答える 2

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
    }
}
于 2014-12-16T05:39:52.667 に答える