2012-04-19 4 views
4

Я в замешательстве: в AS3, почему мы сохраняем конструктор класса Singleton public, а не private, как в Java? Если мы сохраним конструктор public, тогда мы сможем напрямую обращаться к нему со стороны!Почему в версии AS3 Singleton нет частных конструкторов?

Пожалуйста, проверьте модельную часть в this example.

+0

Просто FYI см: http://stackoverflow.com/questions/137975/what -is-так плохо-о-Singletons. Существует почти всегда лучший способ. –

ответ

8

ActionScript 3 не поддерживает частные конструкторы.

Чтобы обеспечить соблюдение шаблона singleton, многие разработчики вынуждают конструктор создавать исключение, если уже создан экземпляр singleton. Это приведет к ошибке времени выполнения, а не к ошибке времени компиляции, но это предотвратит неправильное использование singleton.


Пример:

public static var instance:MySingleton; 

public MySingleton(){ 
    if (instance != null) { 
     throw new Error("MySingleton is a singleton. Use MySingleton.instance"); 
    }else { 
     instance = this; 
    } 
} 
+3

+1 для правильной информации о конструкторах. Кроме того, если вы используете MVC в любом случае, рассмотрите RobotLegs (http://robotlegs.org/) - он поставляется с интегрированной инъекцией зависимостей (http://swiftsuspenders.org/), которая будет обрабатывать однотонные * и * MVC намного проще. – weltraumpirat

4

С гибкой структурой приходит класс "Singleton", который позволяет
зарегистрировать класс к интерфейсу.
С помощью этого метода вы можете скрыть любые функции, которые вы хотите просто не включить его в интерфейсе

// USAGE: is as simple as importing the class and then calling the 
// method you want. 
import com.samples.Sample 

// and then simple just doing 
trace(Sample.someFunction()) // will return true 

// Sample.as

package com.samples{ 
    import flash.utils.getDefinitionByName; 
    import mx.core.Singleton; 

    public class Sample{ 
    //private static var implClassDependency:SampleImpl; 
    private static var _impl:ISample; 

    // static methods will call this to return the one instance registered 
    private static function get impl():ISample{ 
     if (!_impl) { 
     trace('registering Singleton Sample') 
     Singleton.registerClass("com.samples::ISample",com.samples.SampleImpl); 
     _impl = ISample(Singleton.getInstance("com.samples::ISample")); 
     } 
     return _impl; 
    } 

    public static function someFunction():Boolean { 
     return impl.someFunction( ) 
    } 
    } 
} 

// ISample.as

package com.samples{ 
    public interface ISample { 
    function someFunction():Boolean; 
    } 
} 

// SampleImpl.as

package com.samples{ 

    // ExcludeClass will hide functions from the IDE 
    [ExcludeClass] 
    // we can extends a class here if we need 
    public class SampleImpl implements ISample{ 
    // the docs say we need to include this but I donno about that 
    // include "../core/Version.as"; 

    public function SampleImpl(){ 
     // call super if we are extending a class 
     // super(); 
    } 

    // instance will be called automatically because we are 
    // registered as a singleton 
    private static var instance:ISample; 
    public static function getInstance():ISample{ 
     if (!instance) 
     instance = new SampleImpl() 
     return instance; 
     } 
    } 


    // public functions where we do all our code 
    public function someFunction():Boolean { 
     return true; 
    } 
} 
+0

Также полезно отметить, что менеджеры Flex (например, PopupManager) реализованы таким образом.Следовательно, если вы хотите изменить поведение менеджера, вам нужно создать свой класс реализации и зарегистрировать этот класс с менеджером вручную. – Exort

+0

@Exort Хотя вне сферы действия вопроса, но хорошая информация независимо. Я просто хочу добавить. Как и все собственные гибкие синглтоны, такие как PopUpManager для реализации собственной версии PopUpManagerImpl, вы должны сделать это в событии предварительной загрузки приложения. Кажется, что все родные синглтоны зарегистрированы сразу после этого события. И, как вы знаете, будучи синглтоном, когда он установлен, вы не можете его изменить. –

5

Этот blog post, в котором Sho Kuwamoto (ранее Macromedia/Adobe и активно участвовал в разработке платформы и инструментов Flex) объясняет, что решение опустить частные и защищенные конструкторы из ActionScript 3.0 может иметь острый интерес.

Участие Macromedia/Adobe в разработке стандарта ECMAScript 4 и решение сделать ActionScript 3.0 максимально приближенным к спецификации, означало, что они столкнулись с возможностью выбора этих функций, исключая их из языка полностью или до тех пор, пока они не будут стандартизированы (и задержка в выпуске языка в результате).

Интересно, я думаю, потому что он светит на некоторые из ключевых вопросов в открытом или частном стандартах.

4

Вот реализация одноточечного в AS с использованием внутреннего класса:

package{ 
    public class Singleton{ 
     private static var _instance:Singleton=null; 
     public function Singleton(e:SingletonEnforcer){ 
      trace("new instance of singleton created"); 
     } 
     public static function getInstance():Singleton{ 
      if(_instance==null){ 
       _instance=new Singleton(new SingletonEnforcer()); 
      } 
      return _instance; 
     } 
    } 
} 
//I’m outside the package so I can only be accessed internally 
class SingletonEnforcer{ 
//nothing else required here 
} 

Смотреть подробности здесь: http://www.swinburne.edu.au/design/tutorials/P-flash/T-How-to-build-a-Singleton-in-Actionscript-3/ID-143/

Смежные вопросы