Thanks, Sławek. Sadly that doesn't help here because the module returned from Elements.getModule() doesn't compare equal to a new Module1().
What's the need for that in the first place, by the way? Guice already performs module de-duplication. On Tuesday, November 5, 2013 10:15:36 AM UTC-5, Sławek Piotrowski wrote: > > I've encountered similar problem while developing the Moonshine framework. > I've solved this by writing a module wrapper which detects install() calls > with duplicated modules. > See: > > https://github.com/atteo/moonshine/blob/master/container/src/main/java/org/atteo/moonshine/services/internal/DuplicateDetectionWrapper.java > > In your case the usage would be: > DuplicateDetectionWrapper duplicateDetection = new > DuplicateDetectionWrapper(); > > install(duplicateDetection.wrap(new Module1())); > install(duplicateDetection.wrap(new Module1())); // Fine > > install(duplicateDetection.wrap(Elements.getModule(Elements.getElements(new > Module1())))); > > Regards, > Sławek > > On Monday, November 4, 2013 6:50:36 PM UTC+1, Tavian Barnes wrote: >> >> Since Elements.getElements() creates a flat list of bindings, >> constructions that rely on module de-duplication in install() don't work >> perfectly with module re-writing. For example: >> >> interface Interface { >> } >> >> static class Implementation implements Interface { >> } >> >> class Module1 extends AbstractModule { >> @Override >> public void configure() { >> bind(Interface.class).toInstance(new Implementation()); >> } >> >> @Override >> public boolean equals(Object obj) { >> return obj instanceof Module1; >> } >> >> @Override >> public int hashCode() { >> return 0; >> } >> } >> >> class Module2 extends AbstractModule { >> @Override >> public void configure() { >> install(new Module1()); >> install(new Module1()); // Fine >> install(Elements.getModule(Elements.getElements(new Module1()))); // >> A binding to Interface was already configured... >> } >> } >> >> This is especially noticeable with things like Multibinder/MapBinder >> which rely on module de-duplication. >> >> My idea to fix this is to add an Element implementation "InstalledModule" >> or something that would hold the bindings from installed modules, and >> replay them only if the module wasn't already installed in the target >> binder. >> >> That's obviously a pretty big change though. Is there a better way I >> could approach this? Is a "fix" even desired? >> > -- You received this message because you are subscribed to the Google Groups "google-guice" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/google-guice. For more options, visit https://groups.google.com/groups/opt_out.
