Singletor vs Static - czy jest jakaś różnica z punktu widzenia działania programu?

0

Dotyczy C++, Java, C# itp.

Czasami jest potrzeba, żeby jakiś obiekt lub zmienna występowała w jednym egzemplarzu w ramach całego programu. Taką ideę realizuje singleton. Działa on tak, że przy pierwszym przywołaniu tworzy obiekt, a przy każdym następnym przywołuje utworzony obiekt.

Wydaje mi się, że dokładnie ten sam skutek będzie, jak wszystkie pola i metody będą ze słowem "static" i będzie się odwoływać o nich poprzez klasę, a nie poprzez obiekt.

Czy jest jakaś różnica między singletonem a static z punktu widzenia działania programu? Dlaczego podejście ze static nie jest singletonem pomimo, że spełnia warunki singletonu, czyli występuje w jednym egzemplarzu i jest dostępny globalnie z całego programu.

0

Różnic jest sporo.

  1. Leniwa vs Gorliwa inicjalizacja
  2. Problem synchronizacji dostępu w środowisku wielowątkowym
  3. static uniemożliwia zrobienie n-gletonu / puli obiektów
  4. Problem z testowaniem takiego potworka -> mockowanie obiektu jest proste, mockowanie staticów wymaga pewnej "magii"
  5. static wyklucza możliwość używania polimorfizmu
  6. Generalnie taka klasa z samymi staticami nadaje się tylko do tworzenia Utilsów, czyli bezstanowych zbiorów funkcji

W praktyce zamiast takich cudów używa się kontenerów IoC ;)

0

Mówiąc najprościej singleton może być deklaratywny. To znaczy można tak zaimplementować proces jego tworzenia z wykorzystaniem np. fabryki by móc zarządzać ilością tworzonych obiektów. Możesz tworzyć singleton, pulę obiektów, bądź za każdym razem tworzyć nowy. W przypadku metod statycznych nie osiągniesz takiego efektu.

0

To ja pociągnę pytanie dalej: czy warto robić w ogóle klasę z samymi staticami, czy lepiej użyć namespace'a?

0

Nie wszędzie masz dostepny namespace. Klasa z samymi staticami też jest mało fajna. nawet jak na utila, bo jednak ciężko wtedy testować kod, który korzysta z takich staticów.

0
Shalom napisał(a):

Różnic jest sporo.

  1. Leniwa vs Gorliwa inicjalizacja

IME zmienne statyczne są inicjowane podczas pierwszego odwołania do klasy statycznej, tak więc tutaj nie ma różnicy

pisałem o c#

konkretniej, bo teraz sprawdziłem - zmienne statyczne w C# są inicjowane przy pierwszym uruchomieniu metody która zawiera odwołania do klasy statycznej
ale są inicjowane nawet jeżeli w końcu w tej metodzie nie skorzystamy z tej klasy; można powiedzieć że to taka w pół leniwa inicjalizacja

1 użytkowników online, w tym zalogowanych: 0, gości: 1