4

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

请检查本例中的模型部分。

4

4 回答 4

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;
    }
}
于 2012-04-19T17:55:35.997 回答
5

在这篇文中,Sho Kuwamoto(前身为 Macromedia / Adob​​e 并积极参与 Flex 平台和工具的开发)解释了从 ActionScript 3.0 中省略私有和受保护构造函数的决定,可能与此无关。

Macromedia / Adob​​e 参与了 ECMAScript 4 标准的开发,以及让 ActionScript 3.0 尽可能地遵循规范的决定,这意味着他们面临着选择,要么将这些特性从语言中完全删除,要么等待直到它们被标准化(并因此延迟了语言的发布)。

我认为这很有趣,因为它揭示了开放与专有标准辩论中的一些关键问题。

于 2012-04-20T00:07:53.547 回答
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

// 样本.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;
    }
}
于 2012-04-19T18:28:55.517 回答
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/

于 2013-07-04T07:25:47.683 回答