2009-03-18 5 views
2

Nehmen wir an, ich habe eine einfache Klasse namens WebsterDictionary, die eine Funktion hat, die ein Wort nehmen und ihre Definition zurückgeben kann. Vielleicht gibt es eine andere Funktion, die eine Definition nehmen und ein Wort zurückgeben kann. Die Klasse wird ständig von vielen Clients verwendet.Ist eine statische Klasse geeignet, wenn der Status unveränderlich ist?

Um die Suche zu erleichtern, enthält die Klasse eine Mitgliedsvariable, die ein In-Memory-Dictionary ist, das die Wörter und ihre zugeordneten Definitionen speichert. Angenommen, das Wörterbuch kann sich niemals ändern, sobald es initialisiert wurde - es ist konstant und würde nicht über Instanzen hinweg variieren.

Ist dies ein guter Kandidat für die statische Klasse? Ich habe gelesen, dass statische Klassen zustandslos sein sollten ... aber diese Klasse hat einen Zustand (das In-Memory-Wörterbuch) oder?

EDIT: Auch wenn dies eine statische Klasse wird, wann initialisiere ich das Dictionary, da es kein Konstruktor mehr sein würde? Prüfe ich bei jedem Aufruf einer der statischen Methoden, ob der Verweis auf das Dictionary null ist?

Danke.

+0

nein ... kein Grund, es Singleton zu machen. Übergeben Sie es einfach an denjenigen, der es braucht. Es ist flexibler –

Antwort

2

Eine statische Klasse ist geeignet, wenn die Funktionalität nicht ersetzbar sein muss (z. B. für Tests). Wenn Sie einen Stub oder einen Mock verwenden möchten, sollten Sie eine geeignete Schnittstelle erstellen und sie dann mit einem Singleton implementieren.

+0

Unabhängig davon, ob die Implementierung eine Singleton oder eine statische Klasse ist, glauben Sie, dass das Beispiel, das ich zur Verfügung gestellt habe, mehrere Instanzen nicht zulassen sollte, da der Zustand zwischen Instanzen nicht variieren würde? –

+0

Es hängt davon ab, ob es andere Gründe gibt, mehrere Instanzen zuzulassen (wenn es einen anderen Aspekt erleichtert, zum Beispiel die Abhängigkeitsinjektion) - aber mein Bauchgefühl ist nein, sollte es nicht. –

0

Sie könnten entweder Singleton oder eine statische Klasse gehen. Ich würde wahrscheinlich mit einem Singleton gehen, aber ich denke, dass es in dieser speziellen Situation meistens ein Präferenzproblem ist.

0

Eine statische Klasse ist angemessen, wenn nur eine "Instanz" jemals existieren sollte. In diesem Fall ist das Singleton-Muster möglicherweise besser geeignet (je nach den Details). Für ein unveränderliches Objekt, für das Sie mehrere Instanzen benötigen, ist eine statische Klasse natürlich nicht geeignet.

0

Was Sie suchen, könnte Singleton sein?

Es ist nicht notwendig, dass die statische Klasse keinen Zustand haben muss (sie kann statische Elemente als Teil davon haben, die Teil ihres Zustands sein können).

0

Es klingt sehr ähnlich wie Sie beschreiben die Monostate pattern: Sie möchten, dass die gleiche WebsterDictionary von allen geteilt werden. Es ist einfach so, dass die WebsterDictionary auch unveränderlich ist, aber das ist ein orthogonales Anliegen: einfach machen es unmöglich zu aktualisieren (zum Beispiel mit einem schreibgeschützten Wrapper).

1

Um die Antworten anderer zu erweitern, ist eine statische Klasse oder Singleton nützlich, wenn Sie nur eine Instanz einer Klasse benötigen. Dies ist viel einfacher zu erreichen, wenn die Daten unveränderbar sind. Daher gibt es eine Möglichkeit, dass eine statische Klasse das ist, was Sie dafür verwenden möchten. Aber es ist nicht unbedingt der Fall, dass es automatisch ist, was Sie verwenden möchten.

Mein Rat ist, sich eine Frage zu stellen: Wird die Welt zusammenbrechen, wenn ich mehr als eines dieser Objekte instanziiere? Wenn ja, verwenden Sie eine Singleton- oder statische Klasse. Andernfalls verwenden Sie eine reguläre Klasse.

1

Eine statische Klasse könnte hier sein, was Sie wollen (siehe andere Antworten). Aber machen Sie nicht den Fehler, Ihr Wörterbuch "unveränderlich" zu nennen.

Immutable bedeutet nicht, „kann nie zur Laufzeit ändern“ in dem Sinne, dass Sie die Phrase verwendet, weil Ihr Wörterbuch tatsächlich tut Änderung zur Laufzeit; Nachdem Sie es erstellt haben, müssen Sie auch die Elemente hinzufügen. Auch an dieser Stelle können Sie beabsichtigen, dass es nie wieder ändern, aber es ist möglich, um es zu ändern. Ihre Absicht wird nirgendwo erzwungen.

Ein echtes unveränderliches Objekt kann nicht ändern nach der Erstellung, egal wie viel Sie versuchen. Wenn Sie eine Variation des Objekts benötigen, müssen Sie stattdessen eine neue Instanz mit den gewünschten Attributen erstellen.

Sie können sich eine statische Klasse in einer Hinsicht als genau eine Instanz vorstellen. Das ist wahrscheinlich nicht die beste Wahl für ein Muster, für das Sie neue Instanzen für jede Statusänderung erstellen müssen.

+0

Wenn die Klasse keine Möglichkeit zur Änderung ihres Status bietet, wird sie nicht pro Instanz variieren. Sollte es in diesem Fall statisch sein? Wenn es statisch ist, wann wird das Wörterbuch initialisiert, wenn es keinen Konstruktor gibt? –

0

Wie Sie sagten, hält die Klasse eine Form des globalen Zustands, auch wenn sie nur gelesen wird. Mit dem Singleton-Ansatz wird deutlich, dass Daten gespeichert werden.

Wenn Sie die Abhängigkeitsinjektion verwenden, können Sie Singleton-Instanzen injizieren, anstatt alle Klassen mit Code zu versehen, der Ihnen die Instanz liefert. Dies bedeutet, dass die anderen Klassen nicht an den Singleton-Ansatz gebunden sind und wenn Sie ihn beim Testen leichter ersetzen können (kombiniert mit einer Schnittstelle, die es ermöglicht, durch Testmocks ersetzt zu werden).