2013-09-21 76 views
0

我是AS3的新手,來自Java背景。在AS3中,我有一個初始化的靜態常量對象PRESETS,並試圖在構造函數中訪問它,但是我得到一個錯誤,說該常量爲null。在常量初始化之前調用類構造函數嗎?我希望這個常量在構造函數被調用之前就可以使用了。任何人都可以解釋這裏發生了什麼?我想嘗試做這項工作。在Actionscript中,靜態常量初始化之前調用類構造函數嗎?

我以下代碼:

public class TteColor { 
    // This is the constant I'm trying to access from the constructor. 
    public static const PRESETS:Object = { 
     "WHITE": new TteColor("#FFFFFF"), 
     "BLACK": new TteColor("#000000"), 
     "GRAY":  new TteColor("#808080"), 
     "RED":  new TteColor("#FF0000"), 
     "GREEN": new TteColor("#00FF00"), 
     "BLUE":  new TteColor("#0000FF"), 
     "YELLOW": new TteColor("#FFFF00"), 
     "CYAN":  new TteColor("#00FFFF"), 
     "MAGENTA": new TteColor("#FF00FF") 
    }; 

    public static const COLOR_REGEX:RegExp = /^#[\dA-Fa-f]{6}$/; 

    public var intValue:int; 
    public var strValue:String; 

    public function TteColor(color:String, defaultColor:TteColor = null) { 
     trace("trace0"); 
     if (color != null && color.search(COLOR_REGEX) >= 0) { 
     trace("trace1"); 
     strValue = color.toUpperCase(); 
     intValue = uint("0x" + strValue.substring(1)); 
     } else { 
     trace("trace2"); 
     if (!defaultColor) { 
      trace("trace2.1"); 
      trace("PRESETS: " + PRESETS); 
      defaultColor = PRESETS["WHITE"]; // PRESETS constant is still null here? 
     } 
     trace("trace3"); 
     strValue = defaultColor.strValue; 
     intValue = defaultColor.intValue; 
     Logger.warning("Incorrect color value. Defaulting to: " + strValue); 
     } 
    } 
} 

輸出:

輸出表明PRESETS常數爲空。

trace0 
trace2 
trace2.1 
PRESETS: null 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 

更改爲靜態變量

我改變PRESETS常數靜態變量和靜態初始化的值。這工作正常,因爲它應該。當靜態變量有效時,爲什麼常數會失敗?

// Statically initialize PRESETS 
{ 
    PRESETS = new Object(); 
    PRESETS["WHITE"] = new TteColor("#FFFFFF"); 
    PRESETS["BLACK"] = new TteColor("#000000");                                                 PRESETS["GRAY"] = new TteColor("#808080"); 
    PRESETS["RED"] = new TteColor("#FF0000"); 
    PRESETS["GREEN"] = new TteColor("#00FF00"); 
    PRESETS["BLUE"] = new TteColor("#0000FF"); 
    PRESETS["YELLOW"] = new TteColor("#FFFF00"); 
    PRESETS["CYAN"] = new TteColor("#00FFFF");                                                 PRESETS["MAGENTA"] = new TteColor("#FF00FF"); 
} 

// Changed from constant to static class variable. This works fine. 
public static var PRESETS:Object; 

回答

4

在初始化常量爲 之前調用類構造函數嗎?

通常沒有。

但是你明確地從你的靜態成員中調用類的構造函數:

"WHITE": new TteColor("#FFFFFF"), 
"BLACK": new TteColor("#000000"), 
// etc... 

所以,當靜態對象試圖創建本身,它具有運行類的構造函數。在你的類構造函數中,你引用了靜態對象,它還沒有完成自己的創建。

您的第二個示例工作原因是您在開始調用類構造函數之前完成對象的構造。 (此時該對象仍爲空,但至少它不爲空)。

+1

哦。咄!德普時刻就在那裏。謝謝你指出。 – nikeairj

3

靜態成員是類本身的成員,而不是實例。因此,對靜態成員的調用永遠不會調用構造函數,因爲您不是從類創建實例/對象,而是調用類本身的函數/成員。

+0

嗨。謝謝你的評論。我知道靜態是如何工作的。也許我在我的描述中並不清楚(當我問這個問題的時候是凌晨4點),所以我重寫了我想說的話。我希望這次能夠清楚。在第二個例子中,我知道爲什麼我可以在構造函數中訪問靜態變量,但是我對第一個例子感到困惑,因爲在構造函數被調用之前,常量沒有被初始化。希望我澄清一點。 – nikeairj

1

當使用satic常數時,您正嘗試創建同一類的對象。所以當做一個靜態常量初始化時,它是失敗的。

相關問題