为什么AS3版本的Singleton中没有私有构造函数?

时间:2012-04-19 17:51:51

标签: actionscript-3 flex actionscript flex3

我很困惑:在AS3中,我们为什么要保留Singleton类构造函数public而不是private,就像在Java中一样?如果我们保留构造函数public,那么我们可以直接从外部访问它!

请检查this example中的MODEL部分。

4 个答案:

答案 0 :(得分:8)

Actionscript 3不支持私有构造函数。

为了强制执行单例模式,如果已经创建了单例实例,许多开发人员会导致构造函数引发异常。这将导致运行时错误,而不是编译时错误,但它确实阻止了单例的不当使用。


示例:

public static var instance:MySingleton;

public MySingleton(){
    if (instance != null) {
        throw new Error("MySingleton is a singleton. Use MySingleton.instance");
    }else {
        instance = this;
    }
}

答案 1 :(得分:5)

这个blog post,其中Sho Kuwamoto(以前是Macromedia / Adob​​e并且大量参与Flex平台和工具的开发)解释了从ActionScript 3.0中省略私有和受保护构造函数的决定,可能是切向的利益。

Macromedia / Adob​​e参与开发的ECMAScript 4标准,并且决定使ActionScript 3.0尽可能地遵守规范,这意味着他们面临着选择避免这些功能,完全忽略它们的语言,或等到它们被标准化(并因此推迟语言的发布)。

有趣的是,我认为,因为它揭示了公开与专有标准争论中的一些关键问题。

答案 2 :(得分:4)

随着flex框架出现了一个类“Singleton”,它允许你 将类注册到接口。
使用此方法,您可以隐藏任何您想要的功能,只需将其包含在界面

中即可
// USAGE: is as simple as importing the class and then calling the
// method you want.
import com.samples.Sample

// and then simple just doing
trace( Sample.someFunction( ) ) // will return true

// Sample.as

package com.samples{
  import flash.utils.getDefinitionByName;
  import mx.core.Singleton;

  public class Sample{
    //private static var implClassDependency:SampleImpl;
    private static var _impl:ISample;

    // static methods will call this to return the one instance registered 
    private static function get impl():ISample{
      if (!_impl)   {
        trace( 'registering Singleton Sample' )
        Singleton.registerClass("com.samples::ISample",com.samples.SampleImpl);
        _impl = ISample( Singleton.getInstance("com.samples::ISample"));
      }
      return _impl;
    }

    public static function someFunction( ):Boolean {
      return impl.someFunction(   )
    }
  }
}

// ISample.as

package com.samples{
  public interface ISample {
    function someFunction( ):Boolean;
  }
}

// SampleImpl.as

package com.samples{

  // ExcludeClass will hide functions from the IDE
  [ExcludeClass]
  // we can extends a class here if we need 
  public class SampleImpl implements ISample{
    // the docs say we need to include this but I donno about that
    // include "../core/Version.as";

    public function SampleImpl (){
      // call super if we are extending a class
      // super();
    }

    // instance will be called automatically because we are
    // registered as a singleton
    private static var instance:ISample;
    public static function getInstance():ISample{
      if (!instance)
        instance = new SampleImpl()
        return instance;
      }
    }


    // public functions where we do all our code
    public function someFunction( ):Boolean {
      return true;
    }
}

答案 3 :(得分:4)

以下是AS中具有内部类用法的单例的实现:

package{
    public class Singleton{
        private static var _instance:Singleton=null;
        public function Singleton(e:SingletonEnforcer){
            trace("new instance of singleton created");
        }
        public static function getInstance():Singleton{
            if(_instance==null){
                _instance=new Singleton(new SingletonEnforcer());
            }
            return _instance;
        }
    }
} 
//I’m outside the package so I can only be accessed internally
class SingletonEnforcer{
//nothing else required here
}

请在此处查看详细信息:http://www.swinburne.edu.au/design/tutorials/P-flash/T-How-to-build-a-Singleton-in-Actionscript-3/ID-143/