SAS/AF Creating a Singleton Class
	 The contents of this document were originally posted to comp.soft-sys.sas on 6 May 2003.
Evert Von Donkelaar wrote:
> Dear Sas users,
>
> can somebody help me out, please?
> I try to make a singleton class and found many conversations about it
> but no solutions for me.
> Maybe I overlooked something.
...
I'm not sure why, but it appears you don't have to do anything. Empirical evidence suggests that if the objects metaclass _new() does not run _super() the second time an object is being instantiated, _new_ will return the prior instance.
This scl defines a class that is to be used the as metaclass of other classes. Be sure to SAVECLASS and COMPILE it.
work.singleton.SingletonClass.scl
Class WORK.SINGLETON.SINGLETON.CLASS
      Extends SASHELP.FSP.CLASS
      / ( Description="SINGLETON.CLASS")  ;
   Public  Char description
      / (State="O",
         InitialValue="Metaclass that enforces singletoness")
      ;
   _new: Public Method
     optional=
       l: update: list
    / ( Label="new"
      , State="O"
      , SIGNATURE="N") ;
     dcl list instanceList={},
     num rc=0 numberOfMe=0;
     _getInstances(instanceList,'Y');
     numberOfMe=listlen(instanceList);
     if (numberOfMe > 0) then do;
       put "there is already an instance of this class";
* if super runs here
* . you will get a new instance;
* if super does not run here
* . the prior (first and thus only) instance will be returned
* . resulting in a singleton!;
*     _super(l);
     end;
     else do;
       put "there is no object of this class";
* super has to run at least once somewhere to create an instance;
       _super(l);
    end;
  endmethod;
endclass;
This scl defines a test class using the Singleton class as it's metaclass. Be sure to SAVECLASS it.
work.singleton.UniqueInstanceClass.scl
Class work.singleton.UniqueInstance.class
      Extends SASHELP.FSP.OBJECT
      / ( MetaClass="work.singleton.singleton.Class")  ;
EndClass  ;
Now test the singleton to ensure _NEW_ always returns the same object identifier. COMPILE and TESTAF.
work.test.singleton.scl
init:
  declare work.singleton.uniqueInstance.class One
  = _new_ work.singleton.uniqueInstance.class ();
  declare work.singleton.uniqueInstance.class Two
  = _new_ work.singleton.uniqueInstance.class ();
  put One= Two=;
  if One = Two then put "Looks like a singleton.";
  call execcmd ('CANCEL');
return;
Check your LOG window, you will see something like this
numberOfMe=0 there is no object of this class numberOfMe=1 there is already an instance of this class One=4449 Two=4449 Looks like a singleton.
Voila! Singleton.
Copyright 2003 Richard A. DeVenezia This page was last updated 9 May 2003.