2011-02-01 64 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