我不清楚地知道静态公共常量在ActionScript 3中是如何工作的。
每次使用时都会计算常数值吗?
这是一个例子:
public static const DIAMETER:Number = 100;
然后,如果我像这样设置此常量
public static const RADIUS:Number = DIAMETER /2;
我不知道每次使用此常量时是否会计算结果。
我需要一些关于它的信息。
与常量对象类型相同的问题:
public static const MY_POINT:Point = new Point(100,100);
谢谢;)
答案 0 :(得分:4)
'常量'(const
)是一个只能设置一次的对象,必须设置在与对象声明非常接近(通常是立即)的位置。所以你不能这样做:
const val:String;
... 5 minutes later ...
val = 'hello world'
相反,你必须这样做:
const val:String = 'hello world';
从文档中可以看出,您可以在此之后设置它,但似乎没有预定义的时间或顺序可以设置它。你最好立即设置它,就像我上面做的那样。如果您在“严格模式”下编译,则必须按照我上面的设置进行设置。
常数对处理时间有利。因为它是固定值,所以运行时可以以更有效的方式存储它。我不记得具体细节,但是对于标准变量,对象访问时间提供了很大的改进。
static
是一个访问修饰符,就像private
或public
一样(还有其他一些,我建议您阅读所有这些修饰符)。静态对象只存在一次。每次实例化/访问其类时,都会声明一个标准对象。静态对象仅在第一次声明。请考虑以下
public class ClassA {
public static var URL:String = "http://google.com";
public function ClassA(){
//hello world
}
}
这是一个存储有public static var
的简单类。当我像这样实例化类时:
var hello:ClassA = new ClassA();
URL
已创建并设置为Google的网址。现在,静态属性不属于对象,因此如果您尝试访问hello.URL
,它将失败。相反,它属于类定义。因此,您可以ClassA.URL
访问它。在ClassA的范围内,您可以通过ClassA.URL
或仅通过URL
访问它。通常,静态对象在两个地方使用:
Math.PI
或Math.max()
就是这个User
对象,我存储username
和accountType
等。 静态对象既好又坏。对于将被实例化一千次且值永远不会改变的类,它提供了大量的内存使用优势(而不是存储15个字节x 1000或1.5千字节,您只存储前15个字节)。但是,需要考虑范围问题和一般OOP标准。你会发现那些会争论的人,直到他们在静态物体的脸上是蓝色的,并且通过关联Singletons(阅读那些,它们与静态物体不同),永远不应该被使用,因为它违背了OOP原则。我将它用于User对象的例子是值得商榷的,如果它应该是静态的。有些人认为它应该是一个Singleton(我的最新项目实际上使用的是Singleton),有些人认为它应该使用其他方法,有些人甚至认为User
对象应该通过对象无限地传递,所以它到达的地方它需要(这是一个绝对的噩梦)。
实际上,请根据需要使用它们。你是开发者。找出对项目以及您和您的团队最有效的方法。
阅读关于常量的here和here,以获得有关AS3中访问修饰符(以及大多数基于类的OOP语言)的一般概述
static const
可以从中获益。它是一个只存在一次且仅设置一次的对象,因此它提供了内存和进程时间优势。它通常在您需要保存永远不会更改但需要多次访问的值时使用(例如Math.PI
或MouseEvent.MOUSE_DOWN
)
答案 1 :(得分:1)
常数是常数。这意味着它不会改变,因为它是不变的。常量背后的想法是,可以确保它的值在运行时不会改变。如果您尝试为常量指定新值,则会出现如下错误:
1049: Illegal assignment to a variable specified as constant.
在您的示例中,不会重新计算RADIUS
。实际上,当您访问任何变量时不会发生这种行为 - 除非您通过需要在返回之前计算结果的getter访问它。一个例子可能是一个返回两点之间距离的getter。
在最后一个示例中,您将Point
分配给常量。这与您的预期略有不同。您无法做的是继续为<{1}}分配新点。但可以做的是修改该Point的值。例如,您将能够这样做:
MY_POINT
常量最适合存储基本类型(int,uint,Number,Boolean,String)。在这种情况下,最好创建单独的常量来存储Point的MY_POINT.x = 10;
和x
,并省略Point的创建:
y
const POINT_X:int = 10;
const POINT_Y:int = 15;
修饰符实际上与常量无关,它是一个单独的关键字,它将定义的属性或方法添加到类定义而不是该类的实例。因为常量是有状态的并且不会改变,所以没有理由将常量附加到类的每个实例。
在处理原始数据时,常量对于添加可读性和安全性非常有用。这些常量可以存储为作为相关常量集合的类的静态成员,或者使用这些常量作为其方法的参数的类。
static
类就是一个很好的例子 - 它将原始数据(字符串)存储为静态常量来表示不同的事件类型,例如: Event
。使用期望事件类型的方法时,例如Event.ACTIVATE
,我们可以引用该常量而不是原始addEventListener()
。这可以保护我们免受错误的影响,因为原语允许拼写错误 - 如果你输入一个拼写错误,你将收到一个编译时错误。