2011-02-01 32 views
2

我經常看到只調用init()函數的構造函數。爲什麼只有在構造函數中放入init()函數的內容時纔有init()函數?初始化函數的用途

+1

[actionscript 3 init()](http:// stackoverflow。 com/questions/1650714/actionscript-3-init) – taskinoor 2011-02-01 14:32:48

回答

3

對象的構造函數每個實例僅調用一次,而「init」函數可能會多次調用。考慮下面的代碼:

public class Foo 
{ 
    private var initialized:Boolean = false; 

    public function Foo(id:String = null) 
    { 
    _id = id; 

    if (id) 
     init(); 
    } 

    private var _id:String = null; 
    public function get id():String 
    { 
    return _id; 
    } 
    public function set id(value:String):void 
    { 
    if (_id != value) { 
     _id = value; 

     init(); 
    } 
    } 

    private function init():void 
    { 
    if (initialized) 
     return; 

    if (!id) 
     return; 

    initialized = true; 

    // do initialization here 
    } 
} 

基本上所有由所述對象的初始化過程可能無法使用在構造在運行時所需的信息,並且它可以在以後變得可用(在上面的例子,當設置了id屬性時)。所以有時候有一個單獨的init()是有道理的。

3

+1 @mj:調用構造函數時,某些變量可能不可用。

一個相當常見的配置變如下:

package 
{ 
import flash.display.Sprite; 
import flash.events.Event; 

public class Main extends Sprite 
{ 

    public function Main():void 
    { 
     if (stage) init();//if stage is available, init() 
     else addEventListener(Event.ADDED_TO_STAGE, init);//otherwise, wait for the stage to be available 
    } 

    private function init(e:Event = null):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 

     //here we can access the stage 
     //stage.prop = value; 
    } 

} 

} 

,如果這是主類(或文檔類),舞臺的確會在構造函數中avaible。我們可以立即調用init()。 如果這個類被另一個類實例化,它將無法從構造函數中訪問該階段:它將不得不等待被添加到之前的階段。 init()可以承載另一個名字btw:setup,reset ......不管,它只是一個非正式的「約定」;至少當你在某處看到init函數時,幾乎可以肯定它會在所有必要的數據準備好之後初始化對象:)

+0

這是其中的一個「爲什麼我沒有想到這個?」時刻。 – mpdonadio 2011-02-01 15:20:10