![]() |
Wie Singleton Objekt freigeben?
Hallo Gemeinde.
Ich habe mir ein Singleton Objekt gebaut -- und es funktioniert prima: Es wird gleich zu Programmstart erzeugt und ich kann alle Methoden aufrufen - und vor allem: Ich kann keine zweite Instanz erstellen. Jetzt möchte ich aber dieses Objekt auch irgendwann freigeben -- aber ich erreiche den Destructor nicht. Wenn ich es mit Singleton.Destroy versuche bekomme ich den Fehler: Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt. Wie werde ich nun mein Singleton wieder los?
Delphi-Quellcode:
Achso, ich habe das Singleton nach dieser
type
Singleton = class private class var _instance : Singleton; fTest1: integer; fTest2: integer; fTest3: integer; ... public // constructor Create; entfällt, da INITIALIZE destructor Destroy; override; class function Instance : Singleton; class function NewInstance: TObject; override; ... ![]() Habt ihr eine Idee? Vielen Dank Gruß Jazzman |
AW: Wie Singleton Objekt freigeben?
Delphi-Quellcode:
oder besser
Singleton.Instance.Destroy;
Delphi-Quellcode:
:zwinker:
Singleton.Instance.Free;
Du willst ja die Instanz (das instantiierte Objekt) freigeben und nicht den Klassen-Typ. Oder zu baust dir zusätzlich noch eine public
Delphi-Quellcode:
class procedure Singleton.FreeInstance;
begin FreeAndNil(_instance); end; |
AW: Wie Singleton Objekt freigeben?
Zitat:
So einfach manchmal! Lieben Dank & Gruß Jazzman |
AW: Wie Singleton Objekt freigeben?
Hier mein gebetsmühliger Warnhinweis auf der Packungsbeilage zu Singletons:
![]() Wenn ich Singletons verwende (und das ist eher selten), verwende ich eher ![]() mfg Christian |
AW: Wie Singleton Objekt freigeben?
Da du Delphi XE hast, geht das noch sehr viel besser:
Delphi-Quellcode:
So brauchst du dich weder um die Erzeugung noch um die Freigabe kümmern. Und das ist bei einem Singleton finde ich sehr wichtig. Alternativ bietet sich für den Zweck die Verwendung von Interfaces an.
type
TSingleton = class private class var FInstance: TSingleton; FTest1: Integer; FTest2: Integer; FTest3: Integer; class function GetInstance: TSingleton; static; public class destructor Destroy; class property Instance: TSingleton; end; [...] class function GetInstance: TSingleton; begin if not Assigned(FInstance) then FInstance := TSingleton.Create; Result := FInstance; end; class destructor Destroy; begin if Assigned(FInstance) then FInstance.Free; end; |
AW: Wie Singleton Objekt freigeben?
Genauso wie man hier das Erstellen der Instanz blockt, sollte man hier auch noch externe das Freigeben der Instanz verbieten.
|
AW: Wie Singleton Objekt freigeben?
Zitat:
Ich denke, wenn ich mich über Unikate mit der Außenwelt unterhalten möchte, komme ich um Singletons nicht herum. Ob man sie als statische Klasse implementiert oder Singleton, ist doch gehupft wie gesprungen. Aber unabhängig davon: Ein Singleton zu implementieren deutet schon auf schlechtes Design hin. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz