2013-05-16 15 views
13

Sono nuovo al pugnale (anche se ho esperienza con DI dal lavorare su Java EE WebApp usando Weld).Iniezione Dipendenza Dagger Android non riesce su campi privati ​​

Quello che sto cercando di fare è iniettare una dipendenza in una classe. Il campo è privato.

Il pugnale lancia quindi un'eccezione affermando che non può essere iniettata in un campo privato.

Qual è il motivo?

Dopo tutto è possibile scrivere ai campi privati ​​utilizzando riflessioni, anche su Android ..

Se ho impostato la visibilità del campo a qualcosa di diverso da privati ​​l'iniezione sembra funzionare.

risposta

16

Rendere visibile un pacchetto 'campo visibile' potrebbe non essere sempre quello che desideri. La documentazione di Dagger suggerisce quanto segue:

Iniezione di campi finali e membri privati. Per prestazioni ottimali Dagger genera codice. Per ovviare a questo problema, utilizza l'iniezione del costruttore .

Ecco un esempio:

private ItemFactoryImpl itemFactory; 
private BuildingFactory buildingFactory; 

@Inject 
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) { 
    this.itemFactory = itemFactory; 
    this.buildingFactory = buildingFactory; 
} 
+0

Bello, grazie per l'input. Costruttore Injection è qualcosa a cui sono abituato lavorando con CDI .. –

+7

Questo funziona per i tipi costruibili, ma i tipi di SO Android come Activity, Application, Fragment non sono progettati per essere costruiti da altro che dal framework Android, quindi l'iniezione di campo è ancora necessario in questi casi. Ma questo è un buon consiglio in cui hai il controllo sul costruttore. –

1

Basta rimuovere lo private per impostare la visibilità del campo su pacchetto amichevole.

Dagger non supporta l'iniezione su campi privati.

31

Dagger non supporta i campi privati ​​e supporta ancora gli adattatori generati dal codice (per evitare riflessioni). Il modo in cui sistemi come Guice supportano i campi privati ​​è che modificano l'accesso al campo in modo riflessivo prima di accedervi. Poiché dagger genera un InjectAdapter nello stesso pacchetto della classe da iniettare, può accedere a campi compatibili con i pacchetti, protetti o pubblici. Non può accedere ai campi privati.

Uno dei vantaggi di Dagger è che evita la riflessione, quindi l'uso del riflesso per bypassare la visibilità del campo non è una caratteristica desiderabile.

+0

ha senso per me. La segnerà come risposta corretta. Grazie ! –

+0

In qualsiasi momento. :) Sentiti libero di votare anche su ;) –