2010-11-25 82 views
0

我通常使用if(object!= null),但它不能正常工作。如何找出一個類是否已實例化

如何驗證類是否實例化。我想擺脫'不能訪問空對象或引用的屬性'。

謝謝!

我的意思是'var object:Object'只是對Object類實例的引用。當我用'object = new Object()'初始化它時,它在構造函數中運行代碼,初始化它。我如何檢查它是否已被初始化。

+0

你能舉一個例子,說明'if(object!= null)`失敗嗎?很難看出你是否能夠判斷它是否具有非空引用。或者你的意思是初始化 - 就像所有的屬性已經設置好了? – 2010-11-25 17:43:17

+0

是的,已初始化。 – Loop 2010-11-25 18:31:38

回答

1

如果您確實需要知道該類是否已經初始化,那麼我會建議您在類內部使用一個getter,當您完成初始化時返回true值。當然,這隻有在您創建了該類的實例時纔有效。如果我不確定實例是否存在,我首先檢查是否創建實例。我從來沒有遇到任何問題。

if(myObject && myObject.isInitialized) 
{ 
    // success 
} 
0

,而不是if(myobj!=null),你可以做if(myobj)

檢查以查看實例或屬性是否爲null與檢查它是否存在不同。如果myobjnullundefinedif(myobj!=null)失誤undefined(這是實例引用的將是什麼,如果它從來沒有被分配一個值)

if(myobj) 

將失敗。

注意:如果該值設置爲false0,則if(myobj)也將爲false。由於您正在檢查是否擔心空指針異常(因此使用複雜對象),因此可以排除false0之間的可存活值(給出錯誤否定結果),並使用更一般的if語句來檢查實例是否存在存在。

0

您可能有一種常見的情況,即開始在構造函數中加載一些資源,讓我們假設一個背景圖像。 此代碼將無法正常工作:

var object:TestObject = new TestObject(); //inside the contructor, the background image will start loading 
object.background.width = 120; // this will not work, because the background is not loaded yet 

有很多的方法來解決這個...

你可以創建對象之前裝入的資產,他們完全加載後,將其發送到構造函數作爲參數。

或者你可以定義,當他們完成加載,這樣的事情將被分配到加載的資產對象內部的一些屬性:

//outside 
object.BackgroundWidth = 120; 

---------- 

//inside the class 
public var BackgroundWidth:int; 
private var background:Bitmap; 

public function TestObject(){ 
    var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, assignProperties); 
    loader.load("img.png"); 
} 
//this will make sure the width is applied to the background 
//when it's loaded completely 
private function assignProperties(e:Event){ 
    background = Bitmap((event.currentTarget as LoaderInfo).content); 
    background.width = BackgroundWidth; 
} 

我希望這有助於。