Revision: 1555
Author:   drew.mclaughlin
Date:     Thu Jun 16 13:00:26 2011
Log:      Implement hashCode and equals for MultimapBinder.

Prevents duplicate installations when using MapBinder.permitDuplicates(), which installs a MultimapBinder every time it is called.

http://code.google.com/p/google-guice/source/detail?r=1555

Modified:
/trunk/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java /trunk/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java

=======================================
--- /trunk/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java Sun Oct 31 11:38:24 2010 +++ /trunk/extensions/multibindings/src/com/google/inject/multibindings/MapBinder.java Thu Jun 16 13:00:26 2011
@@ -44,6 +44,7 @@
 import com.google.inject.util.Types;
 import static com.google.inject.util.Types.newParameterizedTypeWithOwner;
 import java.lang.annotation.Annotation;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -565,6 +566,15 @@
           }
         });
       }
+
+      @Override public int hashCode() {
+        return multimapKey.hashCode();
+      }
+
+      @Override public boolean equals(Object o) {
+        return o instanceof MultimapBinder
+            && ((MultimapBinder<?, ?>) o).multimapKey.equals(multimapKey);
+      }
     }

     private static final class MapEntry<K, V> implements Map.Entry<K, V> {
=======================================
--- /trunk/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java Sun Dec 12 18:44:36 2010 +++ /trunk/extensions/multibindings/test/com/google/inject/multibindings/MapBinderTest.java Thu Jun 16 13:00:26 2011
@@ -41,6 +41,9 @@
 import com.google.inject.internal.util.ImmutableSet;
 import com.google.inject.internal.util.Maps;
 import com.google.inject.name.Names;
+import com.google.inject.spi.DefaultElementVisitor;
+import com.google.inject.spi.Element;
+import com.google.inject.spi.Elements;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.HasDependencies;
 import com.google.inject.util.Modules;
@@ -302,6 +305,7 @@
             binder(), String.class, String.class);
         multibinder.addBinding("a").toInstance("A");
         multibinder.addBinding("b").toInstance("B");
+        multibinder.permitDuplicates();
       }
     };
     Module bc = new AbstractModule() {
@@ -313,6 +317,17 @@
         multibinder.permitDuplicates();
       }
     };
+    final Set<Key<?>> allBindings = new HashSet<Key<?>>();
+    for (Element element : Elements.getElements(ab, bc)) {
+      element.acceptVisitor(new DefaultElementVisitor<Void>() {
+            @Override public <T> Void visit(Binding<T> binding) {
+              Key<?> key = binding.getKey();
+              assertTrue(String.format("Duplicate binding for %s", key),
+                  allBindings.add(binding.getKey()));
+              return null;
+            }
+          });
+    }
     Injector injector = Guice.createInjector(ab, bc);

assertEquals(mapOf("a", "A", "b", "B", "c", "C"), injector.getInstance(Key.get(mapOfString)));

--
You received this message because you are subscribed to the Google Groups 
"google-guice-dev" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice-dev?hl=en.

Reply via email to