我很困惑:在AS3中,我们为什么要保留Singleton类构造函数public
而不是private
,就像在Java中一样?如果我们保留构造函数public
,那么我们可以直接从外部访问它!
请检查this example中的MODEL部分。
答案 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 / Adobe并且大量参与Flex平台和工具的开发)解释了从ActionScript 3.0中省略私有和受保护构造函数的决定,可能是切向的利益。
Macromedia / Adobe参与开发的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
}