2012-06-30 80 views
6

這是什麼之間的區別:EnumMap的與枚舉值

public enum Direction { 
    NORTH(90), 
    EAST(0), 
    SOUTH(270), 
    WEST(180); 

    private final int degree_; 

    private Direction(int degree) { 
     degree_ = degree; 
    } 

    public int getDegree() { 
     return degree_; 
    } 

    public static void main(String[] args) { 
     System.out.println(NORTH.getDegree()); 
    } 
} 

這:

public enum Direction { 
    NORTH, 
    EAST, 
    SOUTH, 
    WEST; 

    public static void main(String[] args) { 
     EnumMap<Direction, int> directionToDegree = new EnumMap<Direction, int>(Direction.class); 
     directionToDegree.put(NORTH, 90); 
     directionToDegree.put(EAST, 0); 
     directionToDegree.put(SOUTH, 270); 
     directionToDegree.put(WEST, 180); 

     System.out.println(directionToDegree.get(NORTH)); 
    } 
} 

是一個更容易閱讀?更靈活嗎?傳統上使用更多嗎?一個人跑得快嗎?任何其他利弊?

回答

6

第一種情況下,您的財產綁定到enum值(只有一個值)。

第二個是與外部管理的枚舉關聯的值。

想象一下,現在在你的應用程序中你想訪問這個值。如果在第二種情況下這是恆定的,那麼從任何地方引用地圖都會複雜得多。

當你有不同的上下文時,第二種方法會很有用。例如:NORTH,在特定情況下NORTH應該是90,但在另一個上下文中,將需要與其關聯的另一個值(這裏的上下文可能是特定實現)。

+0

爲什麼財產「有界」?這是「保稅」的錯字嗎?不挑剔,好奇。 – Thufir

+0

@Thufir:謝謝,這是一個錯字 –

+0

大聲笑,我以爲有一些特別的意思:)我在想上下界..等等 – Thufir

6

將值添加到枚舉常量本身使它們可用而不引用另一個對象。如果您將此信息存儲在地圖中,則必須將引用傳遞給地圖。如果這些是常量所代表的概念的基本屬性,那麼最好將這些值添加到常量本身中,而不是將它們存儲在映射中。

在枚舉常量上使用值比將它們存儲在映射中要快。

+0

爲什麼第一種方法會更快? – Geek

7

EnumMap的主要用例是當您要將附加數據附加到您不擁有的enum時。通常,您正在使用具有枚舉的公共庫,並且需要使用數據爲每個成員註釋。

作爲一般規則,只要有兩種方法可供您使用,請使用第一種方法。

+0

我發現你的答案充滿了什麼時候做什麼的實際應用?感謝和+1。 – Geek

+0

非常感謝,這是我找到的最好的解釋。 – Heaven42