我经常看到只调用init()函数的构造函数。如果只能将init()函数的内容放在构造函数中,为什么还有一个init()函数?
答案 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函数时,你几乎可以肯定它会在所有必要的数据准备就绪后初始化对象:)