2013-05-16 4 views
13

Ich bin neu zu Dolch (obwohl ich Erfahrung mit DI aus der Arbeit an Java EE WebApps mit Weld).Android Dagger Dependency Injection schlägt auf private Felder fehl

Was ich versuche, ist eine Abhängigkeit in eine Klasse zu injizieren. Das Feld ist privat.

Dolch löst dann eine Ausnahme aus, die besagt, dass es nicht in ein privates Feld injizieren kann.

Was ist der Grund dafür?

Schließlich ist es möglich, private Felder mit Reflexionen, auch auf Android ..

zu schreiben, wenn ich die Sichtbarkeit des Feldes auf etwas anderes als privat die Injektion zu funktionieren scheint.

Antwort

16

Die Erstellung eines privaten Felds "Paket sichtbar" ist möglicherweise nicht immer das, was Sie möchten. Die Dagger-Dokumentation schlägt Folgendes vor:

Injizieren von endgültigen Feldern und privaten Mitgliedern. Für die beste Leistung Dolch generiert Code. Abhilfe schaffen Sie mit dem Konstruktor injection.

Hier ist ein Beispiel:

private ItemFactoryImpl itemFactory; 
private BuildingFactory buildingFactory; 

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

Schön, vielen Dank für die Eingabe. Constructor Injection ist etwas, das ich von der Arbeit mit CDI gewohnt bin. –

+7

Dies funktioniert für konstruierbare Typen, aber Android OS-Typen wie Aktivität, Anwendung, Fragment sind nicht dazu gedacht, von etwas anderem als dem Android-Framework konstruiert zu werden benötigt in diesen Fällen. Aber das ist ein guter Rat, wo Sie die Kontrolle über den Konstruktor haben. –

1

Nur das Entfernen der private, um die Sichtbarkeit Ihres Feldes auf Paket freundlich setzen.

Dolch unterstützt keine Injektion auf privaten Feldern.

31

Dolch kann keine privaten Felder unterstützen und unterstützt weiterhin Code-generierte Adapter (um Reflektionen zu vermeiden). Wie Systeme wie Guice private Felder unterstützen, ändern sie den Zugriff auf das Feld reflektiv, bevor sie auf sie zugreifen. Da dagger einen InjectAdapter im selben Paket wie die zu injizierende Klasse generiert, kann er auf paketfreundliche, geschützte oder öffentliche Felder zugreifen. Es kann nicht auf private Felder zugreifen.

Einer der Vorteile von Dagger ist, dass Reflektionen vermieden werden. Daher ist die Verwendung von Reflektion zur Umgehung der Feldsichtbarkeit kein wünschenswertes Merkmal.

+0

macht Sinn für mich. Wird dies als richtige Antwort markieren. Danke ! –

+0

jederzeit. :) Fühlen Sie sich frei, es auch abzustimmen. ;) –