AS3类/静态变量init定时

时间:2017-03-02 15:26:59

标签: actionscript-3 flash flex

我有一个纯粹的AS3项目(没有mxml)。

使用flex SDK 4.6进行编译时,一个类(及其静态变量)在第一次被引用时(当使用静态成员或正在创建类实例时)。

使用air SDK 24.0进行编译时,许多类(及其静态变量)都会在应用程序启动时出现,而不是在它们被引用之前。为什么?是否有任何编译选项或SWF元标记来阻止这种情况?

我的静态变量需要初始化其他一些数据,这些数据在运行时是动态加载的,而不是在应用程序启动时立即可用。所以,我不希望它们如此早地被引入。

1 个答案:

答案 0 :(得分:2)

  

我的静态变量需要一些其他数据来初始化,那些数据是   在运行时加载动态,在应用程序时无法立即使用   开始。所以,我不希望它们如此早地被引入。

这样做很危险,即使它在ASC 1.0中有效。如果需要在计算某些派生值之前加载数据,则不应该依赖静态初始化。

您可以使用单例,或者只使用在加载数据后显式调用的静态initialize()方法:

private function handleDataLoaded(e:DataEvent):void {
    MyStaticStuff.initialize(e.data);
}

或者,作为替代品,您可以将静态变量重构为内部调用init函数的getter:

public class MyStaticStuff {
    // before
    public static const SOME_VALUE:Number = LoadedData.data.something;

    // after
    private var initialized:Boolean = false;

    private static _SOME_VALUE:Number;

    public static function get SOME_VALUE():Number {
        initialize();
        return _SOME_VALUE:Number;
    }

    private static function initialize():void {
        if (!initialized) {
            initialized = true;
            _SOME_VALUE = LoadedData.data.something;
        }
    }
}

在这种情况下,必须更改使用MyStaticStuff.SOME_VALUE的地方,并且这些值将在您第一次引用时初始化,就像之前一样。但是,重构代码以使用单例和/或显式初始化可能是更好的模式。