我想知道从类中调用公共静态const的有效性,成本或资源
假设我假设我有一个拥有相当多资源的类,并且调用构造函数大约是40kb的内存。
将静态常量添加到同一个类中是否有任何区别,而不是仅使用常量创建一个小类?
对于事件发送者,列出该事件的类将具有类似addEventListener(myClass.Holla,onHolla);
或addEventListener(myClassEventNames.Holla,onHolla);
是否存在差异(足够重要)以保证使用额外的类来存储事件名称?
答案 0 :(得分:3)
没有。没有显着差异。
答案 1 :(得分:2)
访问静态成员与构造函数无关;所以你不会有任何性能问题。
如果有问题的事件是自定义事件,则约定是在该事件子类本身中声明特定事件类(flash.events.Event
的子类)的所有事件的字符串常量。例如,所有鼠标事件常量都在MouseEvent
中声明,所有与菜单相关的事件都在MenuEvent
等中定义。
如果您正在使用Flex mxmlc编译器,此约定将帮助您完成代码。假设您已在类定义(MyClass)之上添加了以下元数据标记。
[Event(name="randomEvent", type="com.domain.events.CustomEvent")]
public class MyClass extends EventDispatcher { }
现在声明此类的实例并输入addEventListener:
var myClass:MyClass = new MyClass();
myclass.addEventListener(
您将在自动填充下拉列表中获得CustomEvent.RANDOM_EVENT
。如果没有元数据标签,它只会为您提供两个默认项目(激活和停用)。元数据标记告诉编译器此类调度类CustomEvent
的事件并键入randomEvent
- 并且编译器假定字符串常量是按照约定定义的,并为您提供CustomEvent.RANDOM_EVENT作为选项。
如果在SomeOtherClass
中声明字符串常量并在元数据标记中提供该类的名称,则自动完成可能仍然有效 - 但这会产生误导,因为有问题的类不会调度任何{{}事件1}}
答案 2 :(得分:1)
你应该对此进行分析。如果设置-compiler.debug = false -compiler.optimize = true,如果使用SWFInvestigator,则可以看到读取内容所需的操作码。
此代码:
var str:String;
str = ThisClass.TEST;
str = TEST;
str = SomeOtherClass.TEST;
str = CONFIGCONSTANT::TEST; // fastest
// str = ThisClass.TEST;
8 getproperty private::TEST //nameIndex = 30
// str = TEST;
12 getlex private::TEST //nameIndex = 30
// SomeOtherClass.TEST;
16 getlex pkg::SomeOtherClass //nameIndex = 29
18 getproperty TEST //nameIndex = 36
// CONFIGCONSTANT::TEST;
22 pushstring "test"
无论哪种方式,速度降低都很小。您将不得不做数以千万计的这些操作才能看到任何明显的减少。但是,您将保存一些处理,因此您将变为绿色! :)