init函数的目的

时间:2011-02-01 14:26:08

标签: actionscript-3

我经常看到只调用init()函数的构造函数。如果只能将init()函数的内容放在构造函数中,为什么还有一个init()函数?

2 个答案:

答案 0 :(得分: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()是有意义的。

答案 1 :(得分: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;
    }

}

}

如果这是Main类(或文档类),那么舞台确实可以在构造函数中使用。我们可以立即调用init()。 如果这个类是由另一个类实例化的,它将无法从构造函数访问该阶段:它必须等待以前添加到该阶段。

init()可以承担另一个名称btw:setup,reset ...无论如何,它只是一个非正式的“约定”;至少当你在某个地方看到一个init函数时,你几乎可以肯定它会在所有必要的数据准备就绪后初始化对象:)