我有一个纯粹的AS3项目(没有mxml)。
使用flex SDK 4.6进行编译时,一个类(及其静态变量)在第一次被引用时(当使用静态成员或正在创建类实例时)。
使用air SDK 24.0进行编译时,许多类(及其静态变量)都会在应用程序启动时出现,而不是在它们被引用之前。为什么?是否有任何编译选项或SWF元标记来阻止这种情况?
我的静态变量需要初始化其他一些数据,这些数据在运行时是动态加载的,而不是在应用程序启动时立即可用。所以,我不希望它们如此早地被引入。
答案 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
的地方,并且这些值将在您第一次引用时初始化,就像之前一样。但是,重构代码以使用单例和/或显式初始化可能是更好的模式。