簡體   English   中英

我可以假設Java枚舉自動遞增1嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM