рд╕реНрдЯреЗрдЯрд┐рдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ 2 рдмрд╛рд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдлреНрд▓реЗрдХреНрд╕ рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдЯрди-рд╕реНрдереИрддрд┐рдХ-рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдмрдЬрд╛рдирд╛, рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реИ:


рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ ( github.com/radistao/test-super-and-static/commit/1f066 :

ChatModel.as
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{ } 

ChatMenuStructure.as
 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"; } } } 

testSuperCall.mxml
 <?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> 


рдпреЗ рдирд┐рд╢рд╛рди рд╣реИрдВ ( gist.github.com/radistao/5478426 ):
getTrace # 1 someStaticConst
getTrace # 2 someStaticVar
рдЙрджрд╛рд╣рд░рдг рдЖрд░рдВрдн рдХрд░реЗрдВ
getTrace # 1 someConst
getTrace # 2 someVar
ChatMenuStructure getTrace chatMenuStructureConst
ChatMenuStructure getTrace chatMenuStructureVar
ChatMenuStructure рдирд┐рд░реНрдорд╛рддрд╛
рдЪрд╛рдЯрдореЙрдбрд▓ contructor 1
рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
рдореЗрдиреВ "ChatMenuStructure рдЙрджрд╛рд╣рд░рдг" рд╣реИ


рдирд┐рд╢рд╛рди рдкрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд╖реНрдХрд░реНрд╖:


рд▓реЗрдХрд┐рди !!!
рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рд╕рдм рдХрд┐рдпрд╛ рдерд╛ - рдореИрдВрдиреЗ getTraceCount рдХрд╛рдЙрдВрдЯрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ getTrace() рдХреЙрд▓ рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ (ChatModel.as рдлрд╝рд╛рдЗрд▓ рдХреА рдкрдВрдХреНрддрд┐ 32) рдХрд╣рд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ред рд╕рднреА рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ рдмрд╕ getTrace() рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдФрд░ рдЕрдиреБрд░реЗрдЦрдг

рдФрд░ рдЕрдм рдирд┐рд╢рд╛рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:
getTrace # 1 someStaticConst
getTrace # 2 someStaticVar
рдЙрджрд╛рд╣рд░рдг рдЖрд░рдВрдн рдХрд░реЗрдВ
getTrace # 1 someConst
getTrace # 2 someVar


getTraceCount рд╕реНрдерд┐рд░ рдЪрд░ рдХреЛ 2 рдмрд╛рд░ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛! WAT?

рдЫрд╡рд┐

рдореЗрд░реА рдлрдЯреА рд╣реБрдИ рдорд╕реНрдЬрд┐рдж рдХреЗ рдЕрд╡рд╢реЗрд╖реЛрдВ рдХреЛ рдмрд░рд╛рдордж рдХрд░рдиреЗ рдФрд░ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдбрдмреНрд▓реНрдпреВрдЯреАрдПрдл рдХреЛ рдЖрдЧреЗ рджреЗрдЦрдирд╛ рдФрд░ рдЦреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛! рдареАрдХ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рд╕рдВрдпреБрдХреН рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдбрдл рдХреЗ рд╕рд╛рде рдирд╛рдЪрддреЗ рд╣реБрдП рдФрд░ рдореГрдд рдлреНрд▓реЗрдХреНрд╕рд░реНрд╕ рдХреА рдЖрддреНрдорд╛рдУрдВ рдХреА рдЪреБрдиреМрддреА, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдкрд░реЗрд╢рд╛рдиреА рдХреНрдпрд╛ рдереА:

private static var getTraceCount : int = 0;


getTrace () рдХреЗ рдкрд╣рд▓реЗ рджреЛ рдХреЙрд▓ рдХреЗ рдиреАрдЪреЗ рдХреЛрдб рдореЗрдВ рд╣реИред рдЗрд╕ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдХреЛ рдХрдХреНрд╖рд╛ (рдХреЛрдб) рдХреЗ рдмрд╣реБрдд "рд╢реАрд░реНрд╖" рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ - рдпрд╣ рд╕рдм рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ( github.com/radistao/test-super-and-static/commit/a0dcd ):
ChatMenuStructure.as
 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{ } 


рдирд┐рд╢рд╛рди ( gist.github.com/radistao/5478443 ):
рдЯреНрд░реЗрд╕реА
 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" 


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ:
  1. getTrace рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдЯреИрдЯрд┐рдХ someStaticConst рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getTrace рд╣реИред рдЗрд╕рдореЗрдВ, getTrace() getTraceCount , initializes рдФрд░ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ 1
  2. getTrace рдХреЛ рджреВрд╕рд░реЗ рд╕реНрдЯреИрдЯрд┐рдХ someStaticVar рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getTrace рд╣реИред рдЗрд╕ getTrace() рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рдВрднрд┐рдХ getTraceCount рдФрд░ 2 рдХрд╛ getTraceCount
  3. рдФрд░ рдпрд╣рд╛рдВ рддреАрд╕рд░реА рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрддрд╛рд░ рдЖрддреА рд╣реИ - рдирд┐рдЬреА рд╕реНрдереИрддрд┐рдХ рдШреЛрд╖рдгрд╛ var getTraceCount: int = 0; рдФрд░ рдЗрд╕ рдЬрдЧрд╣ рдореЗрдВ getTraceCount рджрд░реНрдж рд░рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЦреБрдж рдХреЛ 0 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ!


рдЫрд╡рд┐

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ "рдХреЛрдб рдХреЗ рдиреАрдЪреЗ" рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдЭрдЯрдХрд╛ рд╣реЛрдЧрд╛, рддреЛ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдХрд┐рд╕реЗ рджреЛрд╖ рджреЗрдирд╛ рд╣реИ (рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ): рд╕рдВрдХрд▓рдХ, рдЬрд╛рд╡рд╛-рдорд╢реАрди рдпрд╛ рдлрд╝реНрд▓реИрд╢ рдкреНрд▓реЗрдпрд░?

рд░реБрдЪрд┐ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЧреИрд░-рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ ( github.com/radistao/test-super-and-static/commit/08894 ) рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛:

GetTracesClass.as
 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); } } } 


ChatModel.as
 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{ } 


рдирд┐рд╢рд╛рди ( gist.github.com/radistao/5478479 ):
getTrace # "null" someStaticConst
getTrace # "null" someStaticVar
GetTracesClass рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ 1 рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛
рдЙрджрд╛рд╣рд░рдг рдЖрд░рдВрдн рдХрд░реЗрдВ
getTrace # "GetTracesClass рдЙрджрд╛рд╣рд░рдг # 1" someConst
getTrace # "GetTracesClass рдЙрджрд╛рд╣рд░рдг # 1" someVar
ChatMenuStructure getTrace chatMenuStructureConst
ChatMenuStructure getTrace chatMenuStructureVar
ChatMenuStructure рдирд┐рд░реНрдорд╛рддрд╛
рд╕реБрдкрд░ рд╕реЗ рдкрд╣рд▓реЗ рдЪреИрдЯрдореЙрдбрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ ()
рд╕реБрдкрд░ рдХреЗ рдмрд╛рдж рдЪреИрдЯрдореЙрдбрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ ()
рдЙрджрд╛рд╣рд░рдг рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
рдореЗрдиреВ "ChatMenuStructure рдЙрджрд╛рд╣рд░рдг" рд╣реИ


рд╡рд╣рд╛рдВ, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдмреЗрд╡рдХреВрдл рд╣реИ: getTrace() рдХреА рдкрд╣рд▓реА 2 рдХреЙрд▓ getTrace() getTraceCount рдкрд░ getTraceCount рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдЖрд░рдВрдн рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╢реБрд░реБрдЖрдд рдореЗрдВ getTraceCount рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ( gist.github.com/radistao/54747482 )

рдЫрд╡рд┐
(рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╕реНрдЬрд┐рдж рддреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рддрд╕реНрд╡реАрд░ рдЙрд╕реА рддрд░рд╣ рдбрд╛рд▓реА!)

рдлрд┐рд░ рдореИрдВрдиреЗ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХреА - рд╡рд╣реА рддрд╕реНрд╡реАрд░ рдЬреЛ рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдереАред
рдлрд┐рд░ рдореИрдВрдиреЗ getTraceCount рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди 1 рдХреЗ рд╕рд╛рде (рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рд╣реИ): рдлрд┐рд░ " 2, 3, 2, 3 " рдирд┐рд╢рд╛рди рдореЗрдВ рдЧрд┐рд░ рдЧрдпрд╛ (рдпрд╛рдиреА, рдкрд╣рд▓реА рдмрд╛рд░, рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЬреЛ рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд╕рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд░реНрдЧ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдХреБрдЫ рд╕реНрдерд┐рд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рд▓реЗрдЦ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдВ рд╣реИ: рд╕рдВрдХрд▓рдХ рдореЗрдВ, рдЬрд╛рд╡рд╛ рдорд╢реАрди рдпрд╛ рдлреНрд▓реИрд╢ рдкреНрд▓реЗрдпрд░ рдореЗрдВ? рдХреНрдпрд╛ рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИред

Source: https://habr.com/ru/post/In178367/


All Articles