2010-03-11 14 views

Odpowiedz

33

Jak stwierdzono w połączonym pytaniu, należy użyć metod fabrycznych create().

W twoim przypadku, to znaczy zmienia

this.wordToWordID = new BiMap<String. Integer>(); 

do

this.wordToWordID = HashBiMap.create(); 
+0

Hmm. Twoja odpowiedź rodzi nowe pytanie. ** Dlaczego EnumBimap nie ma metody "create" bez parametrów, takich jak HashBiMap? ** –

+0

@Masi: To dobre pytanie. Sądzę, że powodem jest to, że EnumBimap musi wiedzieć, jakie są jego parametry, a ze względu na typ wymazania nie może tego wiedzieć, chyba że w pewnym momencie przekażesz do niego obiekty "Class". To samo dotyczy "EnumMap" i "EnumSet" w standardowej bibliotece. –

+0

Zatem nie wystarczy, aby 'EnumMap' znał tylko typy. To najwyraźniej sprawia, że ​​niektóre przetwarzanie w oparciu o zawartość danych wejściowych. –

6

BiMap jest interfejsem, i jako taki nie może być instancja. Należy utworzyć instancję konkretnej podklasy zgodnie z wybranymi właściwościami, dostępne podklasy (zgodnie z javadoc) są EnumBiMap, , HashBiMap,.

6

Innym fajnym sposobem na stworzenie BiMap, ale w tym przypadku niezmiennej BiMap, jest użycie ImmutableBiMap.Builder.

static final ImmutableBiMap<String, Integer> WORD_TO_INT = 
    new ImmutableBiMap.Builder<String, Integer>() 
     .put("one", 1) 
     .put("two", 2) 
     .put("three", 3) 
     .build(); 

http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableBiMap.html

+0

Myślę, że w niektórych przypadkach jest to nawet lepsze od odpowiedzi Michaela. Niezmienny dla wydajności, bez zerowych wartości. Co myślisz? Myślę, że ta funkcja pojawiła się po zadaniu pytania. Podręcznik o tym tutaj http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableBiMap.html –

+0

Rekwizyty dla javadocs @ Masi, nie przyszło mi do głowy także tutaj. Sądzę, że niezmienność w porównaniu ze zmiennością jest inną dyskusją, ale ponieważ zawsze używam niezmiennych obiektów, pomyślałem, że przynajmniej ta droga jest warta wzmianki. –