Frage

Da AS3 erlaubt keinen privaten Bauer, es den einzigen Weg, scheint einen Singleton zu konstruieren und garantiert für den Konstruktor nicht explizit über „neuen“ erstellt ist, einen einzigen Parameter zu übergeben und überprüfen.

Ich habe zwei Empfehlungen gehört, ist man den Anrufer zu überprüfen und sicherzustellen, dass es die statische getInstance (), und das andere ist eine private / interne Klasse im gleichen Paket-Namensraum zu haben.

Das private Objekt auf dem Konstruktor übergeben scheint vorzuziehen, aber es sieht nicht wie Sie eine private Klasse im gleichen Paket haben können. Ist das wahr? Und was noch wichtiger ist es der beste Weg, um einen Singleton zu implementieren?

War es hilfreich?

Lösung

Eine leichte Anpassung der enobrev Antwort ist beispielsweise als Getter zu haben. Einige würden sagen, dies ist eleganter. Auch Antwort des enobrev keinen Singleton erzwingen, wenn Sie den Konstruktor aufrufen, bevor getInstance aufrufen. Dies kann nicht perfekt sein, aber ich habe diese getestet und es funktioniert. (Es ist auf jeden Fall eine weitere gute Möglichkeit, dies in dem Buch „Advanced ActionScrpt3 mit Design Patterns“ zu tun).

package {
    public class Singleton {

    private static var _instance:Singleton;

    public function Singleton(enforcer:SingletonEnforcer) {
        if( !enforcer) 
        {
                throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); 
        }
    }

    public static function get instance():Singleton
    {
        if(!Singleton._instance)
        {
            Singleton._instance = new Singleton(new SingletonEnforcer());
        }

        return Singleton._instance;
    }
}

}
class SingletonEnforcer{}

Andere Tipps

Ich habe seit einiger Zeit mit diesem, was ich glaube, ich ursprünglich aus wikipedia aller Orten bekam.

package {
    public final class Singleton {
        private static var instance:Singleton = new Singleton();

        public function Singleton() {
            if( Singleton.instance ) {
                throw new Error( "Singleton and can only be accessed through Singleton.getInstance()" ); 
            }
        }

        public static function getInstance():Singleton {                
            return Singleton.instance;
        }
    }
}

Hier ist eine interessante Zusammenfassung des Problems, die eine führt ähnliche Lösung.

Sie können eine private Klasse erhalten wie folgt:

package some.pack
{
  public class Foo
  {
    public Foo(f : CheckFoo)
    {
      if (f == null) throw new Exception(...);
    }
  }

  static private inst : Foo;
  static public getInstance() : Foo
  {
     if (inst == null)
         inst = new Foo(new CheckFoo());
     return inst;
  }
}

class CheckFoo
{
}

Das Muster, das von Cairngorm verwendet wird (was nicht die beste sein kann) ist eine Laufzeitausnahme im Konstruktor zu werfen, wenn der Konstruktor ein zweites Mal aufgerufen wird. Zum Beispiel:

public class Foo {
  private static var instance : Foo;

  public Foo() {
    if( instance != null ) { 
      throw new Exception ("Singleton constructor called");
    }
    instance = this;
  }

  public static getInstance() : Foo {
    if( instance == null ) {
      instance = new Foo();
    }
    return instance;
  }

}    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top