2014-05-08 8 views
9

mój problem sprowadza się do używania @Assisted z dwoma argumentami tekstowymi do fabryki. Problem polega na tym, że ponieważ Guice traktuje typ jako mechanizm identyfikacji parametrów, oba parametry są takie same i pojawia się błąd konfiguracji.Używanie @Assisted inject z wieloma paramami tego samego typu (@Named params)

Niektóre Kod:

public class FilePathSolicitingDialog { 

    //... some fields 

    public static interface Factory { 
     public FilePathSolicitingDialog make(Path existingPath, 
              String allowedFileExtension, 
              String dialogTitle); 
    } 

    @Inject 
    public FilePathSolicitingDialog(EventBus eventBus, 
            SelectPathAndSetTextListener.Factory listenerFactory, 
            FilePathDialogView view, 
            @Assisted Path existingPath, 
            @Assisted String allowedFileExtension, 
            @Assisted String dialogTitle) { 
     //... typical ctor, this.thing = thing 
    } 

    // ... methods 
} 

Problem leży w parametrach podwójnych strun.

Próbowałem oznaczać każdy ciąg osobnymi adnotacjami @Named ("odpowiednio"), ale to tylko prowadzi do większej liczby błędów konfiguracji. Od dźwięku tych błędów nie chcą wiązać adnotacje na fabryce, więc nie próbowałem niestandardowych adnotacji wiążących.

Prosta i hałaśliwe rozwiązaniem jest utworzenie prostą klasę argument zawierające te trzy wartości wspomaganiem, a po prostu wstrzyknąć że:

public static class Config{ 
     private final Path existingPath; 
     private final String allowedFileExtension; 
     private final String dialogTitle; 

     public Config(Path existingPath, String allowedFileExtension, String dialogTitle){ 
      this.existingPath = existingPath; 
      this.allowedFileExtension = allowedFileExtension; 
      this.dialogTitle = dialogTitle; 
     } 
    } 

    public static interface Factory { 
     public FilePathSolicitingDialogController make(Config config); 
    } 

    @Inject 
    public FilePathSolicitingDialogController(EventBus eventBus, 
               SelectPathAndSetTextListener.Factory listenerFactory, 
               FilePathDialogView view, 
               @Assisted Config config) { 
     //reasonably standard ctor, some this.thing = thing 
     // other this.thing = config.thing 
    } 
} 

To działa i może być dość wolna od błędów, ale jest głośny. Sposób na pozbycie się tej zagnieżdżonej klasy statycznej byłoby miłe.

Dzięki za pomoc!

Odpowiedz

18

Wystarczy popatrzeć na this documentation (poprzednio here):

Making typy parametrów wyraźną

Rodzaje parametrów metody fabryki muszą być wyraźne. Aby użyć wielu parametrów tego samego typu, użyj oznaczenia o nazwie @Assisted, aby rozróżnić parametry. Nazwy muszą być stosowane do parametrów metody fabrykanta:

public interface PaymentFactory { 
    Payment create(
     @Assisted("startDate") Date startDate, 
     @Assisted("dueDate") Date dueDate, 
     Money amount); 
} 

... i parametrów konstruktora wylewka Typ użytkownika:

public class RealPayment implements Payment { 
    @Inject 
    public RealPayment(
     CreditService creditService, 
     AuthService authService, 
     @Assisted("startDate") Date startDate, 
     @Assisted("dueDate") Date dueDate, 
     @Assisted Money amount) { 
    ... 
    } 
} 
+0

Dzięki za to. – Groostav

Powiązane problemy