2016-07-04 15 views
1

Ich arbeite an einer Funktion, die vom Benutzer aktiviert und deaktiviert werden kann. Es ist in einem separaten Modul implementiert und es erstellt einige Threads und ein paar Singletons. Da ich ein separates Modul dafür habe und wir es später in einem separaten Prozess ausführen wollen, habe ich einen separaten Guice Injector dafür verwendet. So habe ich eine Factory-Methode, die den Injektor und gibt eine Klasse erstellt, die die Funktion Schnittstellen implementiert (es hat 3 Schnittstellen)So erstellen und beenden Sie ein Feature ordnungsgemäß

public class FeatureFactory { 
    private Injector injector; 
    public FeatureClass open() { 
     injector = createInjector(); 
     return injector.getInstance(FeatureClass.class); 
    } 
} 

public class FeatureClass implements InterfaceA, InterfaceB, InterfaceC { 

} 

Fragen:

  1. Ist es sinnvoll, einen neuen Injektor zu schaffen in diesem Fall? Ich meine, wenn sich das gesamte Feature in einem separaten Modul befindet? Die Idee war, sie zu entkoppeln und nicht das neue Feature Guice-Modul als Teil der Feature-API zu haben. Wenn nicht, Was wäre ein besserer Ansatz?
  2. Das Zurückgeben der Feature-Class anstelle der Schnittstellen riecht nicht gut. Es informiert den Benutzer über die Implementierung Wie überwinde ich das? Derzeit habe ich die Anwendung Guice-Modul verwendet, um die Schnittstellen an die FeatureClass
  3. zu binden Wie schließe ich die Funktion und haben alle Klassen Müll gesammelt? Wie ich schon sagte, wenn das Feature geöffnet wird, werden einige Singletons und Threads erstellt. Wenn ich das Injektorfeld auf Null setze, bedeutet das, dass alles Müll gesammelt wird?
+0

Ihre erste Frage ist zu breit und vor allem meinungsbezogen (wie die meisten Best-Practice-Fragen), wie in der [Hilfe/zum Thema], bitte bearbeiten Sie Ihre Frage entsprechend. –

Antwort

1

Es ist generell eine schlechte Idee, mehr als einen Injektor zu erstellen. Singletons sind in einem Injektor angeordnet. Wenn Sie also mehrere Injektoren erstellen, sind Ihre Singletons keine Singletons mehr.

stattdessen eine Factory-Klasse erstellen, die der Anrufer ermöglicht, eine Instanz der Klasse zu erstellen, und injiziert in diese Fabrik ein Provider<FeatureClass>

@Singleton 
public class FeatureClassFactory { 
    private final Provider<FeatureClass> provider; 
    private FeatureClass instance; 

    @Inject 
    FeatureClassFactory(Provider<FeatureClass> provider) { 
    this.provider = provider; 
    } 

    public synchronized FeatureClass get() { 
    if (instance == null) { 
     instance = provider.get(); 
    } 
    return instance; 
    } 
} 

Sie könnten natürlich Provider<FeatureClass> als API einen Singleton verwenden, anstatt Erstellen einer Fabrik, aber 1) Ich mag nicht Guice-Schnittstellen in meinen öffentlichen APIs verwenden und 2) im Produktionsmodus, Singletons werden erstellt, wenn der Injektor initialisiert wird, und Sie sagten, Sie wollten die Erstellung von FeatureClass Instanzen verzögern.

Wie für die Rückgabe einer Implementierung gegenüber einer Klasse, die besser ist, ist eine Frage der Debatte und hängt von der Anwendungsfall und Ihre Codierung Stil.

Schließlich, Da Singletons mit dem Injektor begrenzt sind, behält der Injektor starke Hinweise auf alle Singletons. Wenn Sie während der Lebensdauer der Anwendung Speicher freigeben müssen, müssen Sie Ihren Klassen Speicher freigeben, indem Sie Felder auf null festlegen und/oder Sammlungen löschen.

+0

Danke. in Bezug auf die Schaffung eines neuen Injektors. Der Grund, warum ich das wollte, ist, dass das ganze Feature in einem separaten Modul (einem separaten Jar) geschrieben ist, so dass ich kein guice-Modul als API des Jars wollte. Ich wollte das entkoppeln. Ist das kein Grund, einen neuen Injektor zu bauen? Ich verstehe natürlich, dass die Singletons nur Singletons im Zusammenhang mit dem neuen Injektor sind –

+0

@NirBrachel hängt davon ab, ob der Benutzer mit dem Glas Guice verwendet. Wenn dies der Fall ist, wäre ein Modul eine gute API und das Erstellen eines Injektors wäre problematisch – NamshubWriter