3

I don't know excatly how the static public constants work in ActionScript 3.

Does the constant value will be calculated every time I use it?

Here an example :

public static const DIAMETER:Number = 100;

Then if I set this constant like this

public static const RADIUS:Number = DIAMETER /2;

I don't know if the result will be calculated every time I use this constant.

I need some informations about it.

Same question with a constant object type:

public static const MY_POINT:Point = new Point(100,100);

Thanks ;)

4

2 回答 2

4

'constant' ( const) 是一个只能设置一次的对象,并且必须在对象声明附近(通常立即)设置。所以你不能这样做:

const val:String;

... 5 minutes later ...

val = 'hello world'

相反,您必须这样做:

const val:String = 'hello world';

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

常数有利于处理时间。因为它是一个固定值,所以运行时可以以更有效的方式以不同的方式存储它。我不记得细节了,但是 const 相对于标准变量在对象访问时间方面提供了实质性的改进。

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 的 URL。现在,静态属性不属于对象,因此如果您尝试访问hello.URL,它将失败。相反,它属于类定义。所以你以ClassA.URL. 在 ClassA 的范围内,您可以通过ClassA.URL或仅通过URL. 一般静态对象用在两个地方:

  1. 实用类。Math.PI或者Math.max()是很好的例子
  2. 需要保存单个实例的对象。我喜欢将它们用于用户系统,您只能在任何给定时间以单个用户身份登录。我通常有一个User我存储的对象username等等accountType

静态对象有好有坏。对于将被实例化一千次并且值永远不会改变的类,它提供了显着的内存使用优势(而不是存储 15 字节 x 1000 或 1.5 KB,您只存储前 15 个字节)。但是,需要考虑范围问题和一般 OOP 标准。你会发现人们会争论直到他们脸色发青,静态对象和关联单例(阅读这些,它们与静态对象不同),永远不要使用,因为它违反了 OOP 原则。我将它用于 User 对象的示例是否应该是静态的值得商榷。有些人会认为它应该是单例(实际上我的最新项目使用了单例),有些人会认为它应该使用其他方法,有些人甚至会认为User对象应该通过对象无限传递,以便它到达它需要的地方(这绝对是一场噩梦)。

实际上,请按您认为合适的方式使用它们。你是开发者。找出最适合项目以及您和您的团队的方法。

在此处阅读有关常量的信息,并在此处阅读有关AS3(以及大多数基于类的 OOP 语言)中访问修饰符的一般概述

Astatic const提供了两者的好处。它是一个只存在一次并且只设置一次的对象,因此它提供了内存和处理时间的好处。它通常用于当您需要保存一个永远不会更改但需要多次访问的值时(如Math.PIor MouseEvent.MOUSE_DOWN

于 2013-07-29T23:39:24.127 回答
1

const

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

1049: Illegal assignment to a variable specified as constant.

在您的示例中,RADIUS不会重新计算。事实上,当您访问任何变量时不会发生这种行为 - 除非您通过需要在返回结果之前计算结果的 getter 访问它。这方面的一个例子可能是返回两点之间距离的吸气剂。

在您的最后一个示例中,您将 a 分配Point给一个常量。这与您预期的略有不同。您不能做是继续为MY_POINT. 但是,您可以做的是修改该点的值。例如,您将能够这样做:

MY_POINT.x = 10;

常量最适合存储原始类型(int、uint、Number、Boolean、String)。在这种情况下,您最好创建单独的常量来存储您的点的xy,并省略创建点:

const POINT_X:int = 10;
const POINT_Y:int = 15;


static

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

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

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

于 2013-07-29T23:35:06.683 回答