Singleton-Klasse mit parameter
Ich bin die Entwicklung von computer-vision-Anwendung und ich benötige Classifier Klasse. Diese Klasse wird unveränderlich pro ausführen der Anwendung, und es lädt die trainierten Daten von der Festplatte auf die Initialisierung. Ich will, um sicherzustellen, dass das gesamte Programm haben Zugang zu derselben ausgebildet Daten, und ich will block Neuladen der von der Festplatte, sobald Sie geladen werden.
Was ich nachdachte, war, entweder eine statische Klasse oder singleton. Ich bin mir nicht sicher, wie Sie Sie zum laden von Daten in statische Klasse, weil der Pfad zur Daten-Datei ist nicht wissen, zu compile-Zeit - es werden Programm-argument. Also ich dachte an Singleton-pattern, aber da ich nicht weiß, wie Sie zu initialisieren dynamisch.
Meine Idee war folgende:
class Singleton {
private static Singleton instance;
private Singleton() { ... }
private static SomeDataObject data;
public static Singleton getInstance() {
if(instance == null)
instance = new Singleton();
return instance;
}
public static init(string dataPath){
if(data == null)
loadDataFromFile(dataPath)
}
}
Dies würde nicht arbeiten, denn ich habe keine Kontrolle, welche Methode zuerst aufgerufen werden.
Ich weiß, der richtige Weg wäre, um die Instanz erstellen, die mit Daten am Anfang und pass es auf alle Klassen und Methoden, die es brauchen, aber das ist eigentlich nicht die Allgemeine Lösung. Ich kann verfolgen, alle Anrufe zu Klassifizierer in meinem eigenen code, aber wenn ich es machen würde, den code als API, das wäre ein problem.
Kurz, wie Sie initialisiert singleton zur Laufzeit?
dataPath
programmatisch zugänglich?Sie brauchen nicht beide eine statische singleton-Instanz und - Daten-Objekt. Auch Ihre aktuelle singleton-Implementierung ist nicht thread-sicher.
es könnte entweder von der GUI oder command-line-argument
Zunächst, Sie brauchen, um sicher zu sein, müssen Sie die Verwendung des Singleton-Musters. Singleton sollte verwendet werden, wenn Sie brauchen, um > Sicherstellen, dass nur eine Instanz einer Klasse erstellt wird. < UND > ein globaler Zugriffspunkt auf das Objekt. < Quelle: oodesign.com/singleton-pattern.html Es scheint, dass Sie brauchen nicht ein Singleton. Globale Variablen sind schlecht, Singletons zu.
Ich brauche eine einzige Instanz von SomeDataObject zugänglich und sollte diese Instanz zugegriffen, die von mehreren anderen Arten von Klassifikatoren, nicht notwendig, den Austausch von einigen übergeordneten Klasse.
InformationsquelleAutor jnovacho | 2013-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass (genau), was Sie tun möchten, arbeiten würde.
Den unten funktionieren würde:
Besser umgesetzt werden kann: (das würde ein
NullPointerException
wenn Sie versuchen, es zu benutzen, ohneinit
erste) (nicht wirklich Singleton mehr, obwohl)Dann gibt es: (möglich schlecht Codierung der Praxis abgesehen)
welche ich nehme an, löst nicht wirklich viel.
Sie können den Konstruktor Lesen einer statischen variable gespeichert woanders, aber ich vermute, das ist im Grunde das gleiche problem. Ich glaube nicht, dass Sie es besser machen können als das, was ich in der Antwort (es sei denn, Sie möchten, übergeben Sie den Pfad bei jedem Aufruf
getInstance
).für mich zunächst arbeitete man mit public static void init()
InformationsquelleAutor Dukeling
Ich benutze etwas, das "mehr" threadsicher sind als die aktuellen Gewinn-Lösung mit fast keine synchronisierten verwendet.
InformationsquelleAutor BeCodeMonkey