静态公共常量ActionScript 3的良好做法

时间:2013-07-29 22:59:20

标签: actionscript-3 constants

我不清楚地知道静态公共常量在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);

谢谢;)

2 个答案:

答案 0 :(得分:4)

'常量'(const)是一个只能设置一次的对象,必须设置在与对象声明非常接近(通常是立即)的位置。所以你不能这样做:

const val:String;

... 5 minutes later ...

val = 'hello world'

相反,你必须这样做:

const val:String = 'hello world';

从文档中可以看出,您可以在此之后设置它,但似乎没有预定义的时间或顺序可以设置它。你最好立即设置它,就像我上面做的那样。如果您在“严格模式”下编译,则必须按照我上面的设置进行设置。

常数对处理时间有利。因为它是固定值,所以运行时可以以更有效的方式存储它。我不记得具体细节,但是对于标准变量,对象访问时间提供了很大的改进。

static是一个访问修饰符,就像privatepublic一样(还有其他一些,我建议您阅读所有这些修饰符)。静态对象只存在一次。每次实例化/访问其类时,都会声明一个标准对象。静态对象仅在第一次声明。请考虑以下

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访问它。通常,静态对象在两个地方使用:

  1. Util类。 Math.PIMath.max()就是这个
  2. 的好例子
  3. 您需要保存单个实例的对象。我喜欢将它们用于用户系统,您只能在任何给定时间以单个用户身份登录。我通常有一个User对象,我存储usernameaccountType等。
  4. 静态对象既好又坏。对于将被实例化一千次且值永远不会改变的类,它提供了大量的内存使用优势(而不是存储15个字节x 1000或1.5千字节,您只存储前15个字节)。但是,需要考虑范围问题和一般OOP标准。你会发现那些会争论的人,直到他们在静态物体的脸上是蓝色的,并且通过关联Singletons(阅读那些,它们与静态物体不同),永远不应该被使用,因为它违背了OOP原则。我将它用于User对象的例子是值得商榷的,如果它应该是静态的。有些人认为它应该是一个Singleton(我的最新项目实际上使用的是Singleton),有些人认为它应该使用其他方法,有些人甚至认为User对象应该通过对象无限地传递,所以它到达的地方它需要(这是一个绝对的噩梦)。

    实际上,请根据需要使用它们。你是开发者。找出对项目以及您和您的团队最有效的方法。

    阅读关于常量的herehere,以获得有关AS3中访问修饰符(以及大多数基于类的OOP语言)的一般概述

    static const可以从中获益。它是一个只存在一次且仅设置一次的对象,因此它提供了内存和进程时间优势。它通常在您需要保存永远不会更改但需要多次访问的值时使用(例如Math.PIMouseEvent.MOUSE_DOWN

答案 1 :(得分:1)

const

常数是常数。这意味着它不会改变,因为它是不变的。常量背后的想法是,可以确保它的值在运行时不会改变。如果您尝试为常量指定新值,则会出现如下错误:

  

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


static

const POINT_X:int = 10; const POINT_Y:int = 15; 修饰符实际上与常量无关,它是一个单独的关键字,它将定义的属性或方法添加到类定义而不是该类的实例。因为常量是有状态的并且不会改变,所以没有理由将常量附加到类的每个实例。

在处理原始数据时,常量对于添加可读性和安全性非常有用。这些常量可以存储为作为相关常量集合的类的静态成员,或者使用这些常量作为其方法的参数的类。

static类就是一个很好的例子 - 它将原始数据(字符串)存储为静态常量来表示不同的事件类型,例如: Event。使用期望事件类型的方法时,例如Event.ACTIVATE,我们可以引用该常量而不是原始addEventListener()。这可以保护我们免受错误的影响,因为原语允许拼写错误 - 如果你输入一个拼写错误,你将收到一个编译时错误。