Zajmuję się tworzeniem aplikacji do wizji komputerowej i będę potrzebować klasy Classifier. Ta klasa będzie niezmienna dla każdego uruchomienia aplikacji i ładuje wyszkolone dane z dysku podczas inicjalizacji. Chcę zapewnić, że cały program będzie miał dostęp do tych samych wyszkolonych danych i chcę zablokować ponowne ładowanie z dysku po ich załadowaniu.Klasa Singleton z parametrem
To, co rozważałem, to używać klasy statycznej lub pojedynczej. Nie wiem, jak załadować dane do klasy statycznej, ponieważ ścieżka do pliku danych nie jest znana podczas kompilacji - będzie to argument programowy. Tak więc myślałem o wzorze Singleton, ale nie wiem, jak zainicjować go dynamicznie.
Mój pomysł polegał na użyciu następujących:
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)
}
}
To nie działać, bo nie mają kontroli, która zostanie wywołana metoda pierwsza.
Wiem, że właściwym sposobem byłoby stworzenie instancji z danymi na początku i przekazanie jej wszystkim klasom i metodom, które jej potrzebują, ale to nie jest ogólne rozwiązanie. Mogę śledzić wszystkie połączenia do Classifier w moim własnym kodzie, ale jeśli zrobiłbym kod jako API, byłby to problem.
W skrócie, jak zainicjować singleton w czasie wykonywania?
W jaki sposób programowo dostępny jest parametr 'dataPath'? –
Nie trzeba *** *** obiektu statycznego singleton *** i obiektu danych ***. Ponadto twoja obecna implementacja singleton nie jest bezpieczna dla wątków. – Perception
@MattBall może to być albo z GUI, albo z argumentu wiersza poleceń – jnovacho