我很困惑:在 AS3 中,为什么我们保留 Singleton 类构造函数public
而不是private
像 Java 中那样?如果我们保留构造函数public
,那么我们可以直接从外部访问它!
请检查本例中的模型部分。
我很困惑:在 AS3 中,为什么我们保留 Singleton 类构造函数public
而不是private
像 Java 中那样?如果我们保留构造函数public
,那么我们可以直接从外部访问它!
请检查本例中的模型部分。
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;
}
}
在这篇博文中,Sho Kuwamoto(前身为 Macromedia / Adobe 并积极参与 Flex 平台和工具的开发)解释了从 ActionScript 3.0 中省略私有和受保护构造函数的决定,可能与此无关。
Macromedia / Adobe 参与了 ECMAScript 4 标准的开发,以及让 ActionScript 3.0 尽可能地遵循规范的决定,这意味着他们面临着选择,要么将这些特性从语言中完全删除,要么等待直到它们被标准化(并因此延迟了语言的发布)。
我认为这很有趣,因为它揭示了开放与专有标准辩论中的一些关键问题。
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;
}
}
下面是在 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
}