2013-11-01 7 views
5

Ich habe eine Klasse, die einen Konstruktor hat, wo alle Argumente von GUICE injiziert werden.Java-Konstruktor mit Guice injizierten Feldern zusammen mit nicht injizierten Feldern

Public class Order { 

    private final ClassOne classOneObj; 
    private final ClassTwo classTwoObj; 

    @Inject 
    public order(ClassOne classOneObj, ClassTwo classTwoObj){ 
    this.classOneObj = classOneObj; 
    this.classTwoObj = classTwoObj; 
    } 
} 

Jetzt möchte ich eine weitere Feld (sagen, Int-Status) Variable hinzufügen, die nicht injiziert werden kann.

Ist es eine gute Vorgehensweise, zuerst ein Objekt mit allen injizierten Parametern zu erstellen und dann das neue Feld festzulegen, das nicht mit einer Setter-Methode injiziert werden kann?

kam ich mit einem anderen Ansatz, wo ich eine Fabrik-Klasse erstellt, wie unten angegeben:

public class OrderFactory { 

    private final ClassOne classOneObj; 
    private final ClassTwo classTwoObj; 

    @Inject 
    public order(ClassOne classOneObj, ClassTwo classTwoObj){ 
    this.classOneObj = classOneObj; 
    this.classTwoObj = classTwoObj; 
    } 

    //getter methods for all the above variables 

    public ClassOne getclassOneObj(){ 
      return classOneObj; 
    } 
    .... 

    public Order createOrder(int status) { 
     return new Order(status, classOneObj, classTwoObj); 
    } 
} 

Dann ist die neue Order-Klasse wie

public class Order { 

    int status 
    private final ClassOne classOneObj; 
    private final ClassTwo classTwoObj; 


    public order(int status, ClassOne classOneObj, ClassTwo classTwoObj){ 
    this.status = status 
    this.classOneObj = classOneObj; 
    this.classTwoObj = classTwoObj; 
    } 

    //getter methods for all these member variables 
} 

Nun siehe mal das Auftrag-Objekt erstellen werde ich Erstellen Sie zuerst ein OrderFactory-Objekt, und erstellen Sie dann mit der Methode "createOrder" das Order-Objekt.

Ich bin am Ende schreiben Code schreiben. Nicht sicher, ob dies eine gute Übung ist. Kann jemand dazu vorschlagen, ob dieser Ansatz richtig ist oder es einen besseren Ansatz für dieses Problem gibt?

Ich las in Google Guice und festgestellt, dass es eine Funktion @Assisted für assistierte Injektion für solche Fälle gibt. Aber ich fand das komplex und konnte mich nicht davon überzeugen, ob ich in meinem Fall damit weitermachen sollte.

Vielen Dank im Voraus für jeden Vorschlag oder Anleitung.

+0

Nach iluxa ist Ihre manuelle Herangehensweise an Fabriken in Ordnung, obwohl Sie die assistierte Injektion viel kürzer machen können. Die einzige Sache, die ich über Ihre manuelle Einspritzung ändern würde, ist, einen 'Provder ' und 'Provider ' stattdessen zu spritzen, wenn Sie viele verschiedene Aufträge mit der gleichen OrderFactory erstellen möchten. Ansonsten sieht es gut aus. –

Antwort

-1

Normalerweise injizieren Sie Dinge, die nur mit Mühe aufgebaut werden können. Wenn Sie nur ein int-Feld einfügen, wäre es besser, wenn Sie nur eine Setter-Methode für das Objekt aufrufen (das einige komplexere Abhängigkeiten enthält). Wenn sich ein Feld häufig ändert, wie es ein Feld namens "Status" andeutet, ist es auch kein guter Kandidat für eine Injektion.

+1

Bitte vermeiden Sie Setter wann immer möglich. Wenn es eine Chance gibt, das Objekt unveränderlich und alle seine Felder "final" zu halten, tue das. – iluxa

+0

+1 zu iluxa. Unveränderliche Objekte haben [viele Vorteile] (http://stackoverflow.com/a/214718/1426891).Wir sind uns alle einig, dass das Injizieren von "Status" eine schlechte Idee ist, aber die OP-Frage bestand darin, die Injektion mit _non-injected_-Konstruktorargumenten koexistieren zu lassen, für die es viele gültige Anwendungsfälle gibt. –

+0

Yeah, funktioniert für Google lehrt Sie ein oder zwei Dinge über Guice nicht wahr ... :-) – iluxa

4

Ihr Fabrikansatz ist ausgezeichnet. Bitte verwenden Sie nicht die Setter: Wenn das Feld unveränderlich gemacht werden kann, sollte es unveränderlich sein, ob es "praktisch" ist zu instanziieren.

Eine andere Möglichkeit, die Sie ergreifen können, ist Assisted Injection, die genau dieses Problem löst. Damit definieren Sie nur die Fabrik-Schnittstelle und deren Umsetzung ist magisch Ihnen von Guice gegeben:

class Order { 
    interface Factory { 
    Order create(Status status); 
    } 

    @AssistedInject Order(
     ClassOne one, 
     ClassTwo two, 
     @Assisted Status status) { 
    } 
} 

Code Modul:

bind(Order.Factory.class).toProvider(
    FactoryProvider.newFactory(Order.Factory.class, Order.class)); 

Dann werden die Kunden injizieren Factory und es verwenden, wie sie es tun in deinem Beispiel.

Verwandte Themen