**Rant (and code) follows**

Ew, I hate that pattern. Well I'm not fond of client-aware singleton-dom
either, but ew. What the hell does that "outside the package" definition do?
Add a package-protected class to the default package? Add stuff to Global?
Disappear it into fat air? What about name conflicts?

If you're stuck with non-injection, try to use an interface and put
"getInstance" into a public  static helper / locator function in a public
"Locator" class, that instantiates a package-protected class with public
methods.

Since we can't hide the constructor, all "enforce singleton" patterns are
going to be ugly in AS3. I know two files are a pain, but try and keep the
voodoo inside your package and out of the global namespace :)

If you want "new SingletonClass()" to fail at compile-time like the above
example, create a proper class with a custom namespace to do the enforcing
instead of the throwaway default package class. Call it
"DONTUSEME::ThisIsASingleton" if you wanna make things clear :) You can also
enforce it at runtime if you like, using something like the below code.

Oh, and make it "function get instance()" instead of "function
getInstance()", this is ActionScript.

If you're stuck doing a one-file singleton because you're too used to Java
*ducks*, do it something like this:

[Mixin]
public final class SingletonClass {

  static private var __enforceSingletonKey : Number;
  static private var __instance : SingletonClass;

  static function init (root : DisplayObject) : void
  {
    //It's just safer to do it here than on the static declaration above.
And you'll dodge some compiler bugs that misreport errors :)
    __enforceSingletonKey = Math.random();
  }

  function SingletonClass(key : Number)
  {
    if (key != __enforceSingletonKey) throw new Error("Don't instantiate me
bro!");
  }

  public static function get instance() : SingletonClass
  {
    if (!__instance)
      __instance = new SingletonClass(__enforceSingletonKey);

    return instance;
  }
}

-Josh

On Thu, Jul 17, 2008 at 4:55 AM, dbronk <[EMAIL PROTECTED]> wrote:

> Here is my preferred way of creating a singleton class.  Usage would
> be: MySingleton.instance.someVar
>
>
> Dale
>
> --------------------------------------------------------------------
>
> package your.package
> {
>
> [Bindable]
> final public class MySingleton
> {
> public static const instance : MySingleton= new
> MySingleton(SingletonLock);
>
> public var someVar : String = "Hello";
>
> public function MySingleton(lockClass:Class)
> {
> if ( lockClass != SingletonLock || instance != null )
> {
> throw new Error("Invalid instantiation.  Please use instance.");
> }
> }
>
> }
> }
>
> class SingletonLock {}
>
> --------------------------------------------------------------------
>
>
>
>
>
> --- In [email protected], "Tracy Spratt" <[EMAIL PROTECTED]> wrote:
> >
> > A singleton class will have a static getInstance() method.
> >
> >
> >
> > Anywhere you need to access members of the singleton, call that method.
> > Just import the class, do not use the normal instantiation procedures,
> > like new, or using an mxml tag.
> >
> > import mypackage.MyModel;
> >
> > [Bindable]private var _myModel:MyModel; //optional var reference
> >
> >
> >
> > Private function init(): void
> >
> >   _myModel = MyModel.getInstance();
> >
> >   Alert.show(_myModel.myFunction())
> >
> >
> >
> > <mx:Text ...text="{_myModel.myBindablePublicProperty}"
> >
> >
> >
> > Tracy
> >
> >
> >
> > ________________________________
> >
> > From: [email protected] [mailto:[EMAIL PROTECTED] On
> > Behalf Of Scott
> > Sent: Wednesday, July 16, 2008 12:42 PM
> > To: [email protected]
> > Subject: [flexcoders] Anyone have a good resource on singletons?
> >
> >
> >
> > I'm trying to find information on using singletons in AS3/Flex.  I've
> > got an .AS file set up but I'm having issues calling the data/functions
> > within that function in other classes.  Does anyone have a good resource
> > on the web for creating and using singletons?
> >
> >
> >
> > Thanks!
> >
>
>
>
> ------------------------------------
>
> --
> Flexcoders Mailing List
> FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
> Search Archives:
> http://www.mail-archive.com/flexcoders%40yahoogroups.comYahoo! Groups
> Links
>
>
>
>


-- 
"Therefore, send not to know For whom the bell tolls. It tolls for thee."

:: Josh 'G-Funk' McDonald
:: 0437 221 380 :: [EMAIL PROTECTED]

Reply via email to