2016-07-17 11 views
0

Zeit zu vermeiden, mein Guice-Modul verfügt über Entlassungen, die ein wenig wie folgt aussehen:Guice: Wie Redundanz in Module

public GuiceModule extends AbstractModule { 

    @Provides 
    @Named("Thing1") 
    String Thing1Provider() { 
    return someFunction("Thing1"); 
    } 

    @Provides 
    @Named("Thing2") 
    String Thing2Provider() { 
    return someFunction("Thing2"); 
    } 

    ....... 

    @Provides 
    @Named("Thing5") 
    String Thing5Provider() { 
    return someFunction("Thing5"); 
    } 

} 

Offensichtlich ist dies sehr unhandlich ist. Wie vermeide ich das?

+0

Können Sie erklären, warum Sie für diese Objekte eine Injektion verwenden? Mein Instinkt ist, dass dies völlig falsch ist, aber ich müsste mehr über das Problem wissen, das Sie lösen wollen. – Sam

+0

Wie wäre es mit einer '@Provides Map ' Methode? Oder ein [Multibinding] (https://github.com/google/guice/wiki/Multibindings)? –

+1

Das Einfügen von '@Named (" thing1 ") String thing1' scheint unnötig, wenn' thing1' bereits als Ergebnis von 'doSomething (" thing1 ") definiert ist. Einfach "DoSomething" einspielen. – Sam

Antwort

1
List<String> names = ...; 
for (String name : names) { 
    bind(String.class) 
      .annotatedWith(Names.named(name)) 
      .toProvider(() -> doSomething(name)); 
} 

Da aber die Kommentare vorgeschlagen, würde ich prüfen, entweder ein MapBinder verwenden, oder einfach nur telefonieren doSomething direkt, wenn es gebraucht wird, anstatt @Named überall zu verwenden.