package { public class ChatModel { public var someConst : String = getTrace("someConst"); public var someVar : String = getTrace("someVar"); public static const someStaticConst : String = getTrace("someStaticConst"); public static var someStaticVar : String = getTrace("someStaticVar"); public const menu : ChatMenuStructure = new ChatMenuStructure(); private static var _instance : ChatModel; public static function get instance() : ChatModel { trace("Get instance start"); if (!_instance) { _instance = new ChatModel(new T()); } trace("Get instance end"); return _instance; } public function ChatModel(t : T) { trace("ChatModel contructor 1"); } private static var getTraceCount : int = 0; public static function getTrace(str : String) : String { getTraceCount++; trace("getTrace #" + getTraceCount, str); return str; } } } internal class T{ }
package { public class ChatMenuStructure { public const chatMenuStructureConst : String = getTrace("chatMenuStructureConst"); public var chatMenuStructureVar : String = getTrace("chatMenuStructureVar"); public function ChatMenuStructure() { trace("ChatMenuStructure constructor"); } public static function getTrace(str : String) : String { trace("ChatMenuStructure getTrace", str); return str; } public function toString() : String { return "ChatMenuStructure instance"; } } }
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="creationCompleteHandler()"> <fx:Script> <![CDATA[ public var chatModel : ChatModel = ChatModel.instance; public const menu : ChatMenuStructure = chatModel.menu; protected function creationCompleteHandler():void { trace("menu is \"" + String(menu) + "\""); } ]]> </fx:Script> <fx:Declarations> <!-- Place non-visual elements (eg, services, value objects) here --> </fx:Declarations> </s:Application>
getTrace # 1 someStaticConst
getTrace # 2 someStaticVar
Get instance start
getTrace # 1 someConst
getTrace # 2 someVar
ChatMenuStructure getTrace chatMenuStructureConst
ChatMenuStructure getTrace chatMenuStructureVar
ChatMenuStructure constructor
ChatModel contructor 1
Get instance end
menu is "ChatMenuStructure instance"
super()
in the constructor does not change the order of initialization (sequence-results of traces: commit github.com/radistao/test-super-and-static/commit/7f930 and trays gist.github.com/radistao/5478435 )getTraceCount
counter how many times it was called (line 32 of the ChatModel.as file) in the call to the static getTrace()
method, which I used to initialize constants and variables. All I did to him was just increment and treysil with every getTrace()
callgetTrace # 1 someStaticConst
getTrace # 2 someStaticVar
Get instance start
getTrace # 1 someConst
getTrace # 2 someVar
getTraceCount
initialized 2 times! WAT?private static var getTraceCount : int = 0;
package { public class ChatModel { private static var getTraceCount : int = 0; public var someConst : String = getTrace("someConst"); public var someVar : String = getTrace("someVar"); public static const someStaticConst : String = getTrace("someStaticConst"); public static var someStaticVar : String = getTrace("someStaticVar"); public const menu : ChatMenuStructure = new ChatMenuStructure(); private static var _instance : ChatModel; public static function get instance() : ChatModel { trace("Get instance start"); if (!_instance) { _instance = new ChatModel(new T()); } trace("Get instance end"); return _instance; } public function ChatModel(t : T) { trace("ChatModel contructor before super()"); super(); trace("ChatModel contructor after super()"); } public static function getTrace(str : String) : String { getTraceCount++; trace("getTrace #" + getTraceCount, str); return str; } } } internal class T{ }
getTrace <b>#1</b> someStaticConst getTrace <b>#2</b> someStaticVar Get instance start getTrace <b>#3</b> someConst getTrace <b>#4</b> someVar ChatMenuStructure getTrace chatMenuStructureConst ChatMenuStructure getTrace chatMenuStructureVar ChatMenuStructure constructor ChatModel contructor before super() ChatModel contructor after super() Get instance end menu is "ChatMenuStructure instance"
getTrace
is getTrace
to initialize the first static object someStaticConst
. In this getTrace()
getTraceCount
, initialized and incremented to 1getTrace
is getTrace
to initialize the second static object someStaticVar
. In this getTrace()
already initialized getTraceCount
and incremented to 2.getTraceCount
completely painlessly goes back to 0 and everything starts from the beginning! package { public class GetTracesClass { private static var constructorCalls : int = 1; private var instanceNumber : int; public function GetTracesClass() { trace("GetTracesClass constructor called " + String(constructorCalls) + " time(s)"); instanceNumber = constructorCalls; constructorCalls++; } public function toString() : String { return "GetTracesClass instance #" + String(instanceNumber); } } }
package { public class ChatModel { public var someConst : String = getTrace("someConst"); public var someVar : String = getTrace("someVar"); public static const someStaticConst : String = getTrace("someStaticConst"); public static var someStaticVar : String = getTrace("someStaticVar"); public const menu : ChatMenuStructure = new ChatMenuStructure(); private static var _instance : ChatModel; public static function get instance() : ChatModel { trace("Get instance start"); if (!_instance) { _instance = new ChatModel(new T()); } trace("Get instance end"); return _instance; } public function ChatModel(t : T) { trace("ChatModel contructor before super()"); super(); trace("ChatModel contructor after super()"); } private static var getTraceCount : GetTracesClass = new GetTracesClass(); public static function getTrace(str : String) : String { trace("getTrace #\"" + getTraceCount + "\"", str); return str; } } } internal class T{ }
getTrace # "null" someStaticConst
getTrace # "null" someStaticVar
GetTracesClass constructor called 1 time (s)
Get instance start
getTrace # "GetTracesClass instance # 1" someConst
getTrace # "GetTracesClass instance # 1" someVar
ChatMenuStructure getTrace chatMenuStructureConst
ChatMenuStructure getTrace chatMenuStructureVar
ChatMenuStructure constructor
ChatModel contructor before super ()
ChatModel contructor after super ()
Get instance end
menu is "ChatMenuStructure instance"
getTrace()
do not complain getTraceCount
getTraceCount at getTraceCount
, although they address it, and after its initialization everything goes further and further normally. If you initialize getTraceCount
at the beginning, everything goes fine ( gist.github.com/radistao/5478482 )getTraceCount
not with zero, but 1 (i.e., not with default value): then " 2, 3, 2, 3
" fell in the traces (i.e., for the first time, all the same, it was taken not the default value for int , but the one that is confused by it in the initializer).Source: https://habr.com/ru/post/178367/
All Articles