Nun ist also klar, wie man verhindern kann, dass ein Konstruktor erstellt wird, und wie Entwickler Instanzen mithilfe von statischen Methoden erstellen können. Der kritische Punkt bleibt jedoch der Cache, in dem die Instanzen der Klasse enthalten sind, die man speichern und für zukünftige Aufrufe bereitstellen will. An dieser Stelle kommt die Collection ins Spiel. Das gesamte Programm beruht darauf, dass frühere Instanzen der instanziierten Klasse gesucht und gefunden werden können. Collections können Objekte speichern und indizieren, so dass die statischen Methoden sie auffinden können.
Die Collection ist für die Cache-Speicherung der Objekte unerlässlich und bildet daher auch eine Voraussetzung für das Erstellen einer Singleton-Klasse.
Zusammenfügen der Einzelteile
Nun sind alle Voraussetzungen für das Erstellen einer eigenen Singleton-Klasse gegeben. In Listing A ist eine Method-Klasse zu sehen, während Listing B die MethodCollection-Klasse zeigt.
Listing A:
Listing B:
Diese beiden Klassen sorgen dafür, dass eine einzelne Instanz aus beliebigen Daten in der Method-Klasse erstellt wird. Dieser aus einer umfangreicheren IIS Log Parsing-Anwendung extrahierte Code wurde so konzipiert, dass er die vergleichsweise wenigen in einer Log-Datei vorhandenen Anfrage-Methoden benutzt und so das Erstellen von Millionen von Instanzen verhindert. Die Pseudo-Code-Kommentare in den Listings dienen dazu, unnötige Details wie den Datenbank-Zugang zu entfernen.
Der Aufbau der Collection sieht zwei grundsätzliche Suchmethoden vor. Diese Methoden, die beide GetMethod()-Overrides sind, finden Methoden entweder anhand ihrer Ganzzahl-ID oder anhand der String-Darstellung. Auf dieser Ebene wird eine Null ausgegeben, wenn die Methode nicht gefunden wird. Darüber sind zwei GetOrCreateMethod()-Overrides angeordnet. Diese rufen GetMethod() auf, erstellen jedoch eine Methode, wenn nichts gefunden wird. Auf diese Weise ist es egal, ob der aufrufende Code eine Methode in der Datenbank findet oder nicht – wenn nicht, wird automatisch eine erstellt.
Für jede dieser Methoden gibt es ein statisches Gegenstück. Diese statischen Methoden arbeiten anhand einer einzelnen globalen Methoden-Liste. Diese funktioniert mithilfe einer statischen Methode, die eine globale Instanz der Method-Collection ausgibt oder erstellt. Die statischen Methoden mit Präfix benutzen die globale Instanz und rufen die oben beschriebenen Methoden auf.
Der Effekt des Ganzen besteht darin, dass die Collection direkt genutzt werden kann. Dies bietet sich in Fällen an, wo Subsets der Methoden benötigt werden, wobei jedoch auch eine globale Instanz vorhanden ist, so dass der Entwickler nicht unbedingt eine eigene Liste verwalten muss.
Was die Method-Klasse anbelangt, unterstützt diese eine Reihe von statischen GetMethod-Funktionen. Diese wiederum werden von der MethodCollection aufgerufen. Sie geben entweder die Methode aus oder Null. In der Method-Klasse kann es vorkommen, dass ein interner Konstruktor eine Datenzeile aufnimmt, was die Performance verbessern soll. Auf diese Weise kann das Objekt mit einer bereits gefüllten Datenzeile instanziiert werden. Dies macht sich bei einer so kleinen Klasse kaum bemerkbar, doch ermöglicht es in größeren Klassen mit einer potenziell höheren Anzahl von Instanzen das Erstellen ohne weitere Datenbankabfragen, was die Performance merklich optimiert.
Problem Multithreading
Im Rahmen dieser Singleton-Klasse wäre Multithreading ein Problem, da mehrere Instanzen des Methoden-Namens als Objekte erstellt werden könnten – sogar in der Datenbank. In vielen Fällen spielt das Thema Multithreading beim Erstellen eines Singleton keine Rolle – sollte es aber doch erforderlich sein, muss man ein eigenes Critical-Section-Handling einflechten um zu verhindern, dass ein und derselbe Hinzufügungscode von zwei Vorgängen gleichzeitig ausgeführt wird. Damit wird ausgeschlossen, dass Einträge doppelt hinzugefügt werden.
Neueste Kommentare
Noch keine Kommentare zu .NET beschleunigen durch Singleton-Objekte
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.