【问题标题】:Java - Usage of "this" in Enums? [duplicate]Java - 在枚举中使用“this”? [复制]
【发布时间】:2013-06-29 06:21:30
【问题描述】:

我正在尝试使用枚举创建层次结构类型系统。我以前从未使用过枚举。

这个方法总是返回 Peasant。我认为这是因为我错误地使用了“this”,或者我完全误解了枚举。

public enum Rank {
    PEASANT,
    TRADER,
    SQUIRE,
    MERCHANT,
    KNIGHT,
    NOBLE,
    KING;

    public Rank getNextRank() {
        switch (this) {
        case PEASANT:
            return SQUIRE;
        case SQUIRE:
            return KNIGHT;
        case KNIGHT:
            return NOBLE;
        case NOBLE:
            return KING;
        case KING:
            return PEASANT;
        }
        return PEASANT;
    }
}

(我意识到 KING 案例不是必需的,但我喜欢它的可读性)

我想Rank.PEASANT.getNextRank()返回Rank.SQUIRERank.NOBLE.getNextRank()返回Rank.KING

【问题讨论】:

  • 你的方法工作得很好。
  • 您的方法有效。请在您调用它的地方发布代码...
  • @Baadshah 我不这么认为。我为 Rank.SQUIRE.getNextRank() 获得了 Rank.PEASANT
  • @DrAgonmoray 请检查屏幕截图所附的帖子。

标签: java enums switch-statement


【解决方案1】:

该代码应该工作,但我个人只使用ordinal()

public Rank getNextRank() {
    Rank[] allRanks = Rank.values();
    return allRanks[(ordinal() + 1) % allRanks.length];
}

如果您在枚举中使用静态 final 字段(在静态初始化程序块中设置为 Rank.values()),则可以避免调用 Rank.values()(在每次调用时创建一个新数组)。

如果您可以将“下一个等级”传递给枚举构造函数并将其存储为字段,那就太好了,但在这种情况下这不起作用,因为您每次都有效地使用前向引用。您可以有一个非最终字段,并在静态初始化器中设置值,当然:

public enum Rank {
    PEASANT,
    TRADER,
    SQUIRE,
    MERCHANT,
    KNIGHT,
    NOBLE,
    KING,

    private Rank next;

    static {
        PEASANT.next = TRADER;
        TRADER.next = SQUIRE;
        SQUIRE.next = MERCHANT;
        MERCHANT.next = KNIGHT;
        NOBLE.next = KING;
        KING.next = PEASANT;
    }

    public Rank getNextRank() {
        return next;
    }
}

这会更灵活,例如,如果您想要两个“相等”的排名,它们都具有相同的“下一个”排名。

【讨论】:

    【解决方案2】:

    我无法在 cmets 中传达它工作正常。请看图片。

    再次检查流程。问题出在其他地方。

    System.out.println(Rank.SQUIRE.getNextRank());  //printed KNIGHT
    

    【讨论】:

    • 啊,你是对的......问题完全是另一回事,超出了我应该在这里提出的任何问题的范围。谢谢
    • @DrAgonmoray 发生在每个程序员身上 :) 很高兴我能帮助你 :)
    猜你喜欢
    • 2019-10-09
    • 2013-07-23
    • 2014-04-28
    • 2012-04-08
    • 2011-12-15
    • 1970-01-01
    • 2019-05-22
    • 2023-04-04
    • 2018-06-03
    相关资源
    最近更新 更多