2013-07-29 25 views
2

我不知道靜態公共常量如何在ActionScript 3中工作。靜態公共常量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

如果這兩個常量在分離文件中,我會建議不要使用第一種情況。我不確定as3的具體情況,這就是爲什麼我沒有回答這個問題,但在C++中有一個叫做static fiasco初始化順序的東西。在這種情況下,無法確定哪個靜態常量變量會首先初始化。可能是因爲as3沒有這樣的問題:) – krizajb

回答

1

const

常量是恆定的。這意味着它不會改變,因爲它是不變的。常數背後的想法是,您可以放心,它的價值在運行時不會改變。如果你嘗試分配一個新值不變,你會得到這樣的錯誤:

1049: Illegal assignment to a variable specified as constant.

在你的榜樣,RADIUS不重新計算。事實上,當你訪問任何變量時,這種行爲不會發生 - 除非你通過一個需要在返回結果之前計算結果的getter來訪問它。這可能是一個例子,它返回兩點之間的距離。

在你最後的例子中,你將一個Point分配給一個常量。這種行爲有點不同於你所期望的。你不能做的是繼續並指定新的指向MY_POINT可以做什麼,但是修改該點的值。例如,你可以這樣做:

MY_POINT.x = 10; 

常量是最適合用於存儲基本類型(INT,UINT,數字,布爾值,字符串)。在這種情況下,你會過得更好創建單獨的常量存儲您點的xy,並省略創建點:

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


static

static修改實際上是與常量無關,它是一個單獨的關鍵字,它將定義的屬性或方法添加到類定義中,而不是該類的實例。因爲一個常量是有狀態的並且不會改變,所以沒有理由將一個常量附加到一個類的每個實例上。

常量以便與原始數據時增加可讀性和安全性非常有用。這些常量可以存儲爲一個類的靜態成員,作爲相關常量的集合,或者將這些常量用作其方法的參數的類。

Event類就是一個很好的例子 - 它將原始數據(字符串)存儲爲靜態常量以表示不同的事件類型,例如, Event.ACTIVATE。當使用期望事件類型的方法時,例如addEventListener(),我們可以參考那個常數而不是原始的"activate"。這可以防止錯誤,因爲原語允許拼寫錯誤 - 如果您使拼寫錯誤訪問常量,您將收到編譯時錯誤。

+0

「_因爲常量是有狀態的並且不會改變,所以沒有理由給類的每個實例附加一個常量」:在大多數情況下你將初始化具有相同值的所有實例的不變屬性,是無用的和浪費的資源。
但是想想如何在一個類的所有實例中添加一個唯一的id:你可能會很好地實現它:'private static var lastId:uint = 0; public const id:uint = ++ lastId;'它允許你在不使用getter的情況下使id爲只讀,並且既優化又簡潔。 – jauboux

3

A「恆定」(const)是隻能設置一次,並且必須在靠近(通常立即)設置爲對象的聲明的對象。所以,你不能做到這一點:

const val:String; 

... 5 minutes later ... 

val = 'hello world' 

相反,你必須做到:

const val:String = 'hello world'; 

從文檔,看來以後可以設置它比這一點,但似乎沒有成爲一個預定義的時間或順序,您可以在其中設置它。如上所述,您最好立即設置它。如果在「嚴格模式」下編譯,則必須按照上面的方法設置必須爲

常數是一個很好的處理時間。因爲它是一個固定值,所以運行時可以以更有效的方式以不同的方式存儲它。我不記得具體細節,但consts在標準變量的對象訪問時提供了實質性的改進。

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創建並設置爲谷歌的網址。現在,一個靜態屬性不屬於一個對象,所以如果你試圖訪問hello.URL,它將會失敗。相反,它屬於類定義。所以你可以像ClassA.URL那樣訪問它。在ClassA的範圍內,您可以通過ClassA.URL或僅通過URL訪問它。通常,靜態對象在兩個地方使用:

  1. Util類。 Math.PIMath.max()情況下,你需要保存單個實例這
  2. 對象的好例子。我喜歡將它們用於用戶系統,您只有在任何給定時間才能以單個用戶身份登錄。我通常有一個User對象,其中我存儲usernameaccountType等。

靜態對象是有好有壞。對於將被實例化一千次的類,該值永遠不會改變,它提供了大量的內存使用優勢(而不是存儲15個字節x 1000或1.5千字節,只存儲前15個字節)。但是,需要考慮範圍問題和一般OOP標準。在面對靜態對象時,你會發現有人會爭辯,直到他們面對藍色,並且通過關聯Singletons(閱讀它們,它們不是靜態對象),永遠不會被使用,因爲它違背OOP原則。如果它應該是靜態的,我將它用於User對象的例子是有爭議的。有人會認爲它應該是一個Singleton(我最新的項目實際上使用了一個Singleton),有些人會認爲它應該使用其他方法,有些人甚至會認爲User對象應該無限通過對象,以便它到達需要的地方(這是一個絕對的噩夢來處理)。

在現實中,按照您認爲合適的方式使用它們。你是開發者。找出最適合該項目以及您和您的團隊的項目。

閱讀here關於常數和here的(一般和大多數基於類的OOP語言)約在AS3訪問修飾符一個很好的概述

一個static const從兩個提供的好處。這是一個只存在一次的對象,只能設置一次,所以它提供了內存和處理時間的好處。它通常用於當您需要保存一個永遠不會改變但需要多次訪問的值(如Math.PIMouseEvent.MOUSE_DOWN