AS3 class / 静态变量初始化时序

AS3 class / static variable init timing

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

当使用 flex SDK 4.6 编译时,class(及其静态变量)在第一次被引用时被初始化(当使用静态成员或创建 class 实例时).

当使用 air SDK 24.0 编译时,许多 class(及其静态变量)在应用程序启动时就被初始化,而不是在它们被引用之前。为什么?是否有任何编译选项或 SWF 元标记来防止这种情况?

我的静态变量需要一些其他数据来初始化,这些数据是在 运行 时动态加载的,不会在应用程序启动时立即可用。所以,我不希望他们这么早就开始。

My static variables need some other data to init, those data are dynamic loaded at run time, not immediately available at application start. So, i do not want them to be inited so early.

这样做一开始就很危险,即使它在 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 的位置,并且值将在第一次被 referenced 时初始化,就像您之前所做的那样.但是重构代码以使用单例 and/or 显式初始化可能是更好的模式。