2013-06-29 29 views
1

我想创建一个使用枚举的层次结构类型系统。我以前从未使用Enum。Java - 在枚举中使用“this”?

此方法总是返回农民。我认为这是因为我错误地使用了“this”,或者我完全误解了enums。

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

+0

你的方法完美的工作。 –

+0

您的方法正在工作。请发布代码,你正在调用它... – Thihara

+0

@Baadshah我不这么认为。我得到Rank.PEASANT for Rank.SQUIRE.getNextRank() – fruitcup

回答

1

我无法在评论中表达它的工作正常。请参阅图片。

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

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

enter image description here

+0

啊,你是对的......这个问题完全是另一回事,超出了我应该问的任何问题的范围。谢谢 – fruitcup

+1

@DrAgonmoray适合每一位程序员:)很高兴我可以帮助你:) –

2

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

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

如果您在枚举中使用静态最终字段(在静态初始化程序块中将其设置为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; 
    } 
} 

这将是更加灵活,例如,如果你想要两个“平等”的行列,其既具有相同的“下一个”等级。