2013-06-29 47 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; 
    } 
} 

這將是更加靈活,例如,如果你想要兩個「平等」的行列,其既具有相同的「下一個」等級。