AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie Singleton Objekt freigeben?

Ein Thema von Jazzman_Marburg · begonnen am 16. Aug 2012 · letzter Beitrag vom 17. Aug 2012
Antwort Antwort
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

Wie Singleton Objekt freigeben?

  Alt 16. Aug 2012, 18:59
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:
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;
...
Achso, ich habe das Singleton nach dieser Methode gebaut.

Habt ihr eine Idee?

Vielen Dank
Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie Singleton Objekt freigeben?

  Alt 16. Aug 2012, 19:16
Singleton.Instance.Destroy; oder besser 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;
$2B or not $2B

Geändert von himitsu (16. Aug 2012 um 19:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#3

AW: Wie Singleton Objekt freigeben?

  Alt 16. Aug 2012, 19:25
Singleton.Instance.Destroy; oder besser Singleton.Instance.Free; ...
Yippieh yeah!

So einfach manchmal!

Lieben Dank & Gruß
Jazzman
--- Delphi XE Starter, Windows 8 ---
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#4

AW: Wie Singleton Objekt freigeben?

  Alt 17. Aug 2012, 20:31
Hier mein gebetsmühliger Warnhinweis auf der Packungsbeilage zu Singletons: http://www.christian-rehn.de/2009/09/03/singletons/

Wenn ich Singletons verwende (und das ist eher selten), verwende ich eher eine testbare Variante.

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Wie Singleton Objekt freigeben?

  Alt 17. Aug 2012, 21:43
Da du Delphi XE hast, geht das noch sehr viel besser:
Delphi-Quellcode:
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;
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wie Singleton Objekt freigeben?

  Alt 17. Aug 2012, 22:19
Genauso wie man hier das Erstellen der Instanz blockt, sollte man hier auch noch externe das Freigeben der Instanz verbieten.
$2B or not $2B
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Wie Singleton Objekt freigeben?

  Alt 17. Aug 2012, 22:20
Hier mein gebetsmühliger Warnhinweis auf der Packungsbeilage zu Singletons
Screen, Mouse, etc. sind also böse Singletons? Oder gar keine?

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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz