Einzelnen Beitrag anzeigen

mr2

Registriert seit: 3. Mai 2003
140 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: [Tutorial] Singletons in Delphi

  Alt 29. Jan 2010, 21:52
Hallo,

folgendes ist mir aufgefallen:

Zitat:
Delphi-Quellcode:
var BK:TBundeskanzer;
begin
  // BK muss natürlich zuvor noch initialisiert werden
  TBundeskanzer.getInstance; // Funktion steht zur Verfügung
  BK.getInstance; // Funktion wird nicht gefunden
end;
Das ist so nicht korrekt, class functions (& procedures) können in Delphi sehr wohl auch auf einer Instanz aufgerufen werden.

Zitat:
Delphi-Quellcode:
Destructor TBundeskanzler.destroy;
begin
  if g_BK = self then
    g_BK := nil;
  inherited destroy;
end;
Die Prüfung auf "g_BK = Self" kannst Du Dir sparen (es ist ja ein Singleton).
Statt dessen finde ich es sinnvoller im Destruktor eine Exception ausgelöst werden, damit niemand (aus Versehen oder absichtlich) die Singleton-Instanz zerstört.

Delphi-Quellcode:
destructor TBundeskanzler.destroy;
begin
  raise Exception.Create('Singleton darf nicht zerstört werden!');
end;
Die Methode getInstance sollte nach Möglichkeit Threadsicher gestaltet werden, damit beim gleichzeitigen Zugriff durch zwei Threads beide die selbe Instanz erhalten:

Delphi-Quellcode:
Function TBundeskanzer.getInstance:TBundeskanzler;
begin
  if (g_BK = nil) // statt TBundeskanzler.create reicht auch nur Create
  then InterlockedCompareExchange(g_BK, Create, nil);
  Result := g_BK;
end;
mr2
"... we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say we know there are some things we don't know. But there are also unknown unknowns - the ones we don't know we don't know."
  Mit Zitat antworten Zitat