2014-05-08 2 views
9

il mio problema si riduce all'utilizzo di @Assisted con due argomenti stringa in fabbrica. Il problema è che, poiché Guice considera il tipo come meccanismo di identificazione dei parametri, entrambi i parametri sono uguali e ottengo un errore di configurazione.Utilizzo di @Assisted inject con più parametri dello stesso tipo (parametri @Named)

Alcuni Codice:

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 
} 

Il problema sta nei parametri doppie stringhe.

Ho provato a codificare ogni stringa con annotazioni separate @Named ("come appropriato"), ma ciò porta solo a più errori di configurazione. Dal suono di quegli errori non vogliono annotazioni vincolanti sulla classe factory, quindi non ho provato annotazioni vincolanti personalizzate.

La soluzione più semplice e rumoroso è quello di creare una classe semplice argomento per contenere questi tre valori assistita, e semplicemente iniettare che:

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 
    } 
} 

Questo funziona ed è probabile che sia abbastanza privo di bug, ma è rumoroso. Un modo per sbarazzarsi di quella classe statica annidata sarebbe bello.

Grazie per qualsiasi aiuto!

risposta

18

Dai un'occhiata alla this documentation (in precedenza here):

Fare tipi di parametri distinti

I tipi di parametri del metodo factory devono essere distinti. Per utilizzare i parametri multipli dello stesso tipo, utilizzare un'annotazione denominata @Assisted per disattivare i parametri. I nomi devono essere applicate ai parametri del metodo fabbrica:

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

... e parametri del costruttore del tipo concreto:

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

Grazie per questo. – Groostav