[英]Can I assume that Java enumerations auto-increment by 1?
Java聲明初始值的序數為0.我可以假設當我創建這樣的枚舉時:
public enum Direction {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, ...}
這的順序TUESDAY
始終為1,即的WEDNESDAY
總是2,...?
我會更具體一點。 我正在宣布一個枚舉:
public enum Direction {UP,RIGHT,DOWN,LEFT}
現在有一種方法可以轉90度(順時針)。 它與序數是一條線:
direction = Direction.values()[direction.ordinal()+1 % Direction.values().length];
如果我不使用序數,我將不得不使用switch語句或條件:
switch (direction) {
case LEFT:newdirection = Direction.UP;
break;
etc...
}
使用序數有幾個優點:
DOWN_LEFT
),如果將新方向放在正確的位置,則實現不一定必須更改 你怎么看?
是的 - 請參閱javadoc :
返回此枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量的序數為零)。
是的 - 但是你的代碼不應該依賴它,因為當有人插入Caturday它會破壞它。
是的,然而,依賴於此會使您的代碼變得脆弱。 如果你改變了枚舉中常量的順序或者在它們之間添加常量,那么一些常量的序數就會改變。 因此,例如,在數據庫或文件中存儲序號不是一個好主意,因為如果源代碼發生更改,數據庫或文件中的數據將不再與您更改的代碼兼容。
更強大的解決方案是使用每個常量顯式存儲代碼。 例如:
public enum Status {
NEW(0),
PROCESSING(1),
OK(2),
ERROR(99);
private final int code;
private Status(int code) {
this.code = code;
}
// Get the code for an enum constant
public int getCode() {
return code;
}
// Given a code, get the corresponding enum constant
public static Status fromCode(int code) {
for (Status s : Status.values()) {
if (s.code == code) {
return s;
}
}
throw new IllegalArgumentException("Invalid code: " + code);
}
}
您還可以強制執行以下索引:
enum Direction {
MONDAY(1),
TUESDAY(2);
// etc...
private int value;
private Direction(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
是。 但是,如果您想要在不同的地方重新排序或添加新的枚舉,或者如果您找到更改現有值的理由,那么依賴於此並不是最佳選擇。 我發現除了它們的序數值和名稱之外,給它們一個實際的價值/意義更好。
序數的問題在於它們取決於枚舉值的聲明順序。 如果在某個時刻將一個新值添加到枚舉中,並將其添加到其他枚舉的中間,那么序數將會更改,從而使依賴於特定序數值的所有代碼無效。
如果您絕對必須為序數值分配固定數字,這可能是有用的:
enum Directions {
NORTH(1),
SOUTH(2),
WEST(3),
EAST(4);
private int code;
Directions(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
在上面的代碼片段中, code
屬性與每個枚舉值相關聯,您可以確定它始終具有相同的值 - 在構造函數中傳遞的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.