4

私は混乱しています: AS3 では、Java のように ではpublicなく、Singleton クラスのコンストラクターを保持するのはなぜですか? privateコンストラクターを保持するpublicと、外部から直接アクセスできます!

この例の MODEL 部分を確認してください。

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

// 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;
    }
}
于 2012-04-19T18:28:55.517 に答える