Назначение функции инициализации - PullRequest
2 голосов
/ 01 февраля 2011

Я часто вижу функции конструктора, которые просто вызывают функцию init (). Зачем нужна функция init (), если вы можете просто поместить содержимое функции init () в конструктор?

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

+ 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 () может иметь другое имя, кстати: setup, reset ... что угодно, это просто неформальное "соглашение";по крайней мере, когда вы видите где-нибудь функцию инициализации, вы можете быть почти уверены, что она инициализирует объект, как только все необходимые данные будут готовы:)

3 голосов
/ 01 февраля 2011

Конструктор объекта вызывается только один раз за экземпляр, тогда как функция «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() иногда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...