рдмрд╛рд╣рд░ рд╕реЗ, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдиреЗ рдирдИ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдВрдбреНрд░реЙрдЗрдб рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИ: рднрд╛рд╖рд╛ рдЬрд╛рд╡рд╛-рд╕рдВрдЧрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдмрдбрд╝реЗ рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд┐рдП, рдЗрд╕рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдбрдмрд▓ рддрд▓ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдбреНрд░реЗрд╕рд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдПрдХ рдЧреБрдкреНрдд рджрд░рд╡рд╛рдЬрд╛ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдВ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдмрд┐рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ "рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ," рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ
рдореЛрдмрд┐рдпрд╕ рд╕рдореНрдореЗрд▓рди рдореЗрдВ рд╕рд░реНрдЧреЗрдИ рд░рдпрд╛рдмреЛрд╡
рдиреЗ рдХреЛрдЯрд▓рд┐рди рдкрд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ
рдореЗрдВ рдмрд╛рдд рдХреА , рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рд╡рд╛ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рджрд░реНрд╢рдХреЛрдВ рдиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдЗрддрдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдХрд┐ рд╣рдордиреЗ рди рдХреЗрд╡рд▓ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдмрд▓реНрдХрд┐ рд╣реЗрдмрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рда рд╕рдВрд╕реНрдХрд░рдг рднреА рдмрдирд╛рдпрд╛:
рдореИрдВ рдХреЛрдЯрд▓рд┐рди рдХреЛ рддреАрди рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рдЕрдм рдХреЗрд╡рд▓ рдЙрд╕ рдкрд░, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдХреЛрдЯрд▓рд┐рди рдХреЛ рдореМрдЬреВрджрд╛ рдЬрд╛рд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рддрд░реАрдХреЗ рд╕реЗ "рдЬрд╛рд╡рд╛ рдФрд░ рдХреЛрдЯрд▓рд┐рди рдХреЛ рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рдмрд╛рдБрдзреЗрдВ" рд╕рд╡рд╛рд▓ рдЕрдХреНрд╕рд░ рдЙрдарддрд╛ рдерд╛ред
рдЕрдХреНрд╕рд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ ...
compile 'rxbinding:xyx' compile 'rxbinding-appcompat-v7:xyx' compile 'rxbinding-design:xyx' compile 'autodispose:xyz' compile 'autodispose-android:xyz' compile 'autodispose-android-archcomponents:xyz'
... рдЗрд╕ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
compile 'rxbinding:xyx' compile 'rxbinding-kotlin:xyx' compile 'rxbinding-appcompat-v7:xyx' compile 'rxbinding-appcompat-v7-kotlin:xyx' compile 'rxbinding-design:xyx' compile 'rxbinding-design-kotlin:xyx' compile 'autodispose:xyz' compile 'autodispose-kotlin:xyz' compile 'autodispose-android:xyz' compile 'autodispose-android-kotlin:xyz' compile 'autodispose-android-archcomponents:xyz' compile 'autodispose-android-archcomponents-kotlin:xyz'
рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ: рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдиреЗ рд░реИрдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреЛрдЯрд▓рд┐рди рд╕реЗ рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдпрджрд┐ рдЖрдкрдиреЗ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреВрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рдВрд╕, рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕, рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдЬреЛ рдЬрд╛рд╡рд╛ 6 рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдФрд░ рдпрд╣ рд╢рд╛рдВрдд рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдХреА рдУрд░ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА, рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд╕рд┐рд░реНрдл рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВ? рд╡реЗ рд╕рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЖрдкрдХреЛ рдЗрди рд╕рднреА рд░реИрдкрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА, рд╣рд░ рдХреЛрдИ рдЦреБрд╢ рдФрд░ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдмреНрд░реЛрд╢рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрд╢рд╛ рдПрдХ "рдЫреЛрдЯреА рдлрд╝реЙрдиреНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛" рд╣реЛрддреА рд╣реИ, рдХреЛрдЯрд▓рд┐рди рдФрд░ рдЬрд╛рд╡рд╛ рдХреЗ рдЬрдВрдХреНрд╢рди рдкрд░ рддреЗрдЬ рдХрд┐рдирд╛рд░реЛрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЬ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рддреЗрдЬ рдзрд╛рд░
рдЖрдЗрдП рдорддрднреЗрджреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЕрд╕реНрдерд┐рд░, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝, рд╕рдЦреНрдд, рдХреНрд╖рдгрд┐рдХ рдХреЛрдИ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИрдВ? рдЙрдиреНрд╣реЗрдВ kotlin.jvm рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реНрдерд┐рдд рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╛рддрдЪреАрдд рдЗрд╕ рдкреИрдХреЗрдЬ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдПрдЧреАред
рдЯрд┐рдореНрдмрд░ рд╣реИ - рдХреБрдЦреНрдпрд╛рдд
рдЭрдХреНрдХрд╛ рд╡рд░реНрддрдиреЛрд╡ рд╕реЗ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп-рдЕрдореВрд░реНрддред рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдЬрд╣рд╛рдВ рдЖрдк рд▓реЙрдЧ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд▓реЙрдЧрдХреИрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░, рдпрд╛ рдХреНрд░реИрд╢ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ, рдФрд░ рдЗрд╕реА рддрд░рд╣) рдкреНрд▓рдЧ-рдЗрди рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЗрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рд╕рдорд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдХреА рдХреЗ рд▓рд┐рдПред рднрдЯрдХрд╛рд╡ рднреАред
object Analytics { fun send(event: Event) {} fun addPlugins(plugs: List<Plugin>) {} fun getPlugins(): List<Plugin> {} } interface Plugin { fun init() fun send(event: Event) fun close() } data class Event( val name: String, val context: Map<String, Any> = emptyMap() )
рд╣рдо рдПрдХ рд╣реА рдирд┐рд░реНрдорд╛рдг рдкреИрдЯрд░реНрди рд▓реЗрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИ - рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рд┐рдХреА рд╣реИред рд╣рдо рд╡рд╣рд╛рдВ рдИрд╡реЗрдВрдЯ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдЬреЛрдбрд╝рд╛ рд╣реИред
рдкреНрд▓рдЧрдЗрди рдПрдХ рдкреНрд▓рдЧрдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдХреЛ рдЕрдореВрд░реНрдд рдХрд░рддрд╛ рд╣реИред
рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдВрдЬреА рдФрд░ рд╣рдорд╛рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдпреБрдХреНрдд рдШрдЯрдирд╛ рд╡рд░реНрдЧред рдпрд╣рд╛рдВ рд░рд┐рдкреЛрд░реНрдЯ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рдВрдЧрд▓реЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ рдПрдХ рд╣реЛрд▓реАрд╡рд░ рдирд╕реНрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХреЛ рдХреИрд╕реЗ рдХрдВрдШреА рдХрд░рдирд╛ рд╣реИред
рдЕрдм рдереЛрдбрд╝рд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдУред рдпрд╣рд╛рдБ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
private fun useAnalytics() { Analytics.send(Event("only_name_event")) val props = mapOf( USER_ID to 1235, "my_custom_attr" to true ) Analytics.send(Event("custom_event", props)) val hasPlugins = Analytics.hasPlugins Analytics.addPlugin(EMPTY_PLUGIN)
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рджрд┐рдЦрддрд╛ рд╣реИред рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд▓рд╛ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдШрдЯрдирд╛, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдШрдЯрдирд╛ред рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдПрдХ рдЦрд╛рд▓реА рдкреНрд▓рдЧрдЗрди рдХреЛ рдкреБрд╢ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдбреНрд░рд╛рдИ рд░рди" рдЪрд▓рд╛ рд╕рдХреЗрдВред рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЬреЛрдбрд╝реЗрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдорд╛рдирдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
private static void useAnalytics() { Analytics.INSTANCE.send(new Event("only_name_event", Collections.emptyMap())); final Map<String, Object> props = new HashMap<>(); props.put(USER_ID, 1235); props.put("my_custom_attr", true); Analytics.INSTANCE.send(new Event("custom_event", props)); boolean hasPlugins = Analytics.INSTANCE.getHasPlugins(); Analytics.INSTANCE.addPlugin(Analytics.INSTANCE.getEMPTY_PLUGIN());
рдЗрдирд╕реНрдЯрд╛рдВрд╕ рдХреЗ рд╕рд╛рде рдЙрдкрджреНрд░рд╡ рддреБрд░рдВрдд рдореЗрд░реА рдЖрдБрдЦреЛрдВ рдореЗрдВ рдлреИрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдКрдкрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдорд╛рдиреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рдХреБрдЫ рдЧреВрдВрдЧрд╛ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЧреЗрдЯрд░реНрд╕ред рдЪреВрдБрдХрд┐ рд╣рдо, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдХреЛрдЯрд▓рд┐рди рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдореЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдПрдХрддреНрд░ рд╣реБрдП рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рд╣рд░ рдЙрд╕ рдХреНрд╖рдг рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЗрд╡реЗрдВрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╕реЗ Colletions.emptyMap () рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐ рдкреЙрдк рдЕрдк рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ?
data class Event( val name: String, val context: Map<String, Any> = emptyMap() )
рд╣рдорд╛рд░реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдорд╛рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЬрд╛рд╡рд╛ рд╕реЗ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ: рдПрдХ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг, рдФрд░ рдПрдХ рдЖрдВрд╢рд┐рдХ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╣ рдХреНрдпреЛрдВ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЧрд▓рдд рд╣реИрдВред
рд╕рднреА рдЯреНрд╡рд┐рд╕реНрдЯ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдЙрдкрдХрд░рдг рдФрд░ рдХреЛрдЯрд▓рд┐рди рдПрдХ рдЬреЗрд╡реАрдПрдо рдмрд╛рдпреЛрдЯреЗрдХ - рдХреЛрдЯрд▓рд┐рди рдмрд╛рдпрдЯреЗрдХ рд╡реНрдпреВрдЕрд░ рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред Android Studio рдФрд░ IntelliJ IDEA рдореЗрдВ, рдпрд╣ рдЯреВрд▓реНрд╕ - рдХреЛрдЯрд▓рд┐рди - рд╢реЛ рдХреЛрдЯрд▓рд┐рди рдмрд╛рдпрдЯреЗрдХреЛрдб рдореЗрдиреВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЖрдк рдмрд╕ Cmd + Shift + A рджрдмрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреЛрдЬ рдмрд╛рд░ рдореЗрдВ Kotlin Bytecode рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ, рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХреЛрдЯрд▓рд┐рди рд╡рд░реНрдЧ рдХреНрдпрд╛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдореИрдВ рдЖрдкрд╕реЗ рдмрд╛рдЗрдЯрдХреЛрдб рдХрд╛ рдЙрддреНрдХреГрд╖реНрдЯ рдЬреНрдЮрд╛рди рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдИрдбреАрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдмрдЯрди Decompile рдмрдирд╛рдпрд╛ред
рдЗрд╕реЗ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдРрд╕реЗ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЕрдЪреНрдЫреЗ рдЬрд╛рд╡рд╛ рдХреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ:
public final class Event { @NotNull private final String name; @NotNull private final Map context; @NotNull public final String getName() { return this.name; } @NotNull public final Map getContext() { return this.context; } public Event(@NotNull String name, @NotNull Map context) { Intrinsics.checkParameterIsNotNull(name, "name"); Intrinsics.checkParameterIsNotNull(context, "context"); super(); this.name = name; this.context = context; }
рд╣рдо рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░, рдЧреЗрдЯрд░реНрд╕, рдЕрдкреЗрдХреНрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдиреАрдЪреЗ рд╣рдо рджреВрд╕рд░реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рд╣реИ: рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЪрд╛рд░ рдХреЗ рд╕рд╛рдеред
рдпрд╣рд╛рдВ рдЖрдк рд╢рд░реНрдорд┐рдВрджрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдереЛрдбрд╝реА рдЧрд╣рд░рд╛рдИ рдкрд░ рдЪрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдлрд░рд╛-рддрдлрд░реА рдордЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ DefaultConstructorMarker рдХреЛрдЯрд▓рд┐рди рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдПрдХ рдирд┐рдЬреА рд╡рд░реНрдЧ рд╣реИ, рдпрд╣рд╛рдБ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдВрдШрд░реНрд╖ рди рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ DefaultConstructorMarker рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрдВрдЯ var3 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреМрди рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрджрд┐ рдмрд┐рдЯрдореИрдХреНрд╕ рджреЛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ var2 рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рд╣рдорд╛рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ рд╕реЗ рдПрдХ рдЪрдорддреНрдХрд╛рд░реА рдПрдиреЛрдЯреЗрд╢рди @JvmOverloads рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрд╛рдд рдХреА рдереАред рд╣рдореЗрдВ рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рд▓рдЯрдХрд╛ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред
data class Event @JvmOverloads constructor( val name: String, val context: Map<String, Any> = emptyMap() )
рдФрд░ рд╡рд╣ рдХреНрдпрд╛ рдХрд░реЗрдЧреА? рдЪрд▓рд┐рдП рдЙрд╕реА рдЯреВрд▓ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреВрд░реНрдг рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдбрд┐рдлреЙрд▓реНрдЯрдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореИрдХрд░ рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдФрд░, рд▓реЛ рдФрд░ рдирд┐рд╣рд╛рд░рдирд╛, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдЬреЛ рдЕрдм рдЬрд╛рд╡рд╛ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ:
@JvmOverloads public Event(@NotNull String name) { this.name, (Map)null, 2, (DefaultConstructorMarker)null); }
рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рд╕рдм рдХреБрдЫ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рд╕реМрдВрдк рджреЗрддреЗ рд╣реИрдВред рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдЬрд╛рд╡рд╛ рдкрдХреНрд╖ рд╕реЗ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ: рд╕рдВрдХрд▓рдХ рдЦреБрд╢ рд╣реИ рдФрд░ рдирд╛рд░рд╛рдЬ рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЖрдЧреЗ рдХреНрдпрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдпрд╣ INSTANCE рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЬреЛ IDEA рдкрд░реНрдкрд▓ рдореЗрдВ рдПрдХ рдХреЙрд▓рд╕ рд╣реИред рдореБрдЭреЗ рдмреИрдВрдЧрдиреА рд░рдВрдЧ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ :)

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рд╡рдЬрд╣ рд╕реЗ рдирд┐рдХрд▓рд╛ред рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рдмрд╛рдИрдЯрдХреЛрдб рджреЗрдЦреЗрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо init рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ init рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред

рдпрд╣реА рд╣реИ, рдЬреЛ рдХреБрдЫ рднреА рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдЗрд╕ рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╣рдо рдЗрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреА рдкреАрдврд╝реА рдХреЛ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдПрдиреЛрдЯреЗрд╢рди @JvmStatic рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ init рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рднреЗрдЬреЗрдВ рдФрд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдм рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реИред
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдереИрддрд┐рдХ рдХреАрд╡рд░реНрдб рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЕрдВрддрд┐рдо init () рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдордиреЗ рдЦреБрдж рдХреЛ INSTANCE рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рд▓рд┐рдпрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдм рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ INSTANCE рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: Alt + Enter рджрдмрд╛рдПрдВ, "рдХреНрд▓реАрдирдЕрдк рдХреЛрдб" рдЪреБрдиреЗрдВ, рдФрд░ рд╡реЙрдпрд▓рд╛, рдЗрдирд╕реНрдЯрд╛рдВрд╕ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдерд╛:
Analytics.send(new Event("only_name_event"));
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛ рднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ:

рдФрд░ рдЯрд┐рдкреНрдкрдгреА: рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВ, рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рд╕реНрд╡рдпрдВ рдлрд╝реАрд▓реНрдбреНрд╕ (рдЙрджрд╛ред рдкреНрд▓рдЧрдЗрдиреНрд╕) рд╕реНрдереИрддрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдереИрддрд┐рдХ рдФрд░ рдЧреЗрдЯрд░реНрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо isInited variable рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ @JvmStatic рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рд╣рдо Kotlin Bytecode Viewer рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ isInited () рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдИ рд╣реИ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред
рдЕрдм рдЗрд╕реЗ рдЬрд╛рд╡рд╛ рдХреЛрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, "рдХреНрд▓реАрди-рдЕрдк" рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕рдм рдХреБрдЫ рдХреЛрдЯрд▓рд┐рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдФрд░ рд╢рдмреНрдж рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдирдпрд╛ - рдареАрдХ рд╣реИ, рдЖрдк рдЙрдирд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдкрд╛рддреЗред
public static void useAnalytics() { Analytics.send(new Event("only_name_event")); final Map<String, Object> props = new HashMap<>(); props.put(USER_ID, 1235); props.put("my_custom_attr", true); Analytics.send(new Event("custom_event", props)); boolean hasPlugins = Analytics.getHasPlugins(); Analytics.addPlugin(Analytics.INSTANCE.getEMPTY_PLUGIN());
рдЕрдЧрд▓рд╛ рдЪрд░рдг: рд╣рдо рдПрдХ рдмрд╛рд░ рдореЗрдВ рджреЛ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдирдо рдирд╛рдо getHasPlugins рдкрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдореИрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкрд╛рд░рдЦреА рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рдФрд░ рдирд┐рд╣рд┐рдд рдерд╛ред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ?
рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд╕рд╛рде рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдЬрд╛рдирддреЗ рдереЗ, рдкреНрд░рд╛рдкрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдФрд░ рдмрд╕рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдЬрд╛рд╡рд╛рдмреАрди рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЗрдЯрд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛, рд╕реЗрдЯ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╕рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИ: рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмреВрд▓рд┐рдпрди рдлрд╝реАрд▓реНрдб рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдирд╛рдо рдЙрдкрд╕рд░реНрдЧ рд╣реИ, рддреЛ рдЧреЗрдЯреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рд╣реЛрдЧрд╛ред рдпрд╣ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдореЗрд╢рд╛ рдмреВрд▓рд┐рдпрди рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рджреВрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред isPlugins рдХрд╛рдлреА рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдирд╛рдо рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдо рдХреИрд╕реЗ рд╣реЛ?
рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рдореИрдВ рдЕрдХреНрд╕рд░ рдЗрд╕реЗ рдЖрдЬ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛)ред @JvmName рдПрдиреЛрдЯреЗрд╢рди рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдирд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд)ред рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ:
@JvmStatic val hasPlugins @JvmName("hasPlugin") get() = plugins.isNotEmpty()
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛: getHasPlugins рд╡рд┐рдзрд┐ рдЕрдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди hasPlugins рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд╛рдлреА рдХреБрдЫ рд╣реИред рдЗрд╕рд╕реЗ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ, рдлрд┐рд░ рд╕реЗ, рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рдеред рдЕрдм рд╣рдо рд╕рднреА рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ!
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдордиреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕реАрдзреЗ рдЧреЗрдЯреНрдЯрд░ рдкрд░ рд░рдЦрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ? рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рддрд╣рдд рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ @JvmName рдХреНрдпрд╛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╡реИрд▓ рд╣реИрдкреНрд▓рдЧрд┐рдиреНрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╣реИ рдХрд┐ рдЙрд╕рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛, рд╕рдВрдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓, рдкреИрд░рд╛рдореАрдЯрд░, рдкреНрд░рддрд┐рдирд┐рдзрд┐, рдХреНрд╖реЗрддреНрд░, рдЧреБрдг, рд░рд┐рд╕реАрд╡рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди-рдлрд╝рдВрдХреНрд╢рди, рд╕реЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреЗрдЯреНрдЯрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдФрд░ рдЕрдЧрд░ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рд╡рд╣реА рдЕрд╕рд░ рд╣реЛрдЧрд╛ рдЬрдм рд╣рдо рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ:
@get:JvmName("hasPlugins") @JvmStatic val hasPlugins get() = plugins.isNotEmpty()
рддрджрдиреБрд╕рд╛рд░, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╕реНрдЯрдо рдЧреЗрдЯреНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реАрдзреЗ рдЕрдкрдиреА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдЧрд╛ред
рдЕрдЧрд▓рд╛ рдмрд┐рдВрджреБ рдЬреЛ рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ "Analytics.INSTANCE.getEMPTY_PLUGIN ()"ред рдпрд╣рд╛рдБ рдмрд╛рдд рдЕрдм рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рднреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕: рдХреНрдпреЛрдВ? рдЙрддреНрддрд░ рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкрд░рд┐рдЪрдпред
рдХрд┐рд╕реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдПрдХ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд╛рд╕реНрдЯ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЧреЗрдЯрдЯрд░-рд╕реЗрдЯрд░ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрдВрдЧреАред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реЛрдЧрд╛ - рдирд┐рдЬреА рдЕрдВрддрд┐рдо рд╕реНрдереИрддрд┐рдХ - рдФрд░ рдпрд╣ рдПрдХ рдмрд┐рд▓рдХреБрд▓ рд╕рд╛рдзрд╛рд░рдг рдЬрд╛рд╡рд╛ рдЪреАрдЬрд╝ рд╣реЛрдЧреАред
рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рдХрд╛рдВрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ EMPTY_PLUGIN = EmptyPlugin () рд╣реИ, рдЗрд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рднрдпрд╛рдирдХ рдЧрдЯрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде @ рдЬреЗрдПрдордПрдирдиреЗрдо рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЙрдкрд╕рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдмрдиреА рд╣реБрдИ рд╣реИ - рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рдеред рдЗрд╕рд▓рд┐рдП, рдкреБрд░рд╛рдиреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдирдП рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдФрд░ рдпрд╣рд╛рдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди @JvmField, рдЬреЛ рдХрд╣рддрд╛ рд╣реИ: "рдореБрдЭреЗ рдпрд╣рд╛рдВ рдЧреЗрдЯрд░реНрд╕ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рд╕реЗрдЯрд░реНрд╕ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рдореБрдЭреЗ рдПрдХ рдлреАрд▓реНрдб рдмрдирд╛рдУред" рдЗрд╕реЗ Val EMPTY_PLUGIN рдХреЗ рд╕рд╛рдордиреЗ рд░рдЦреЗрдВ рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рддреНрдп рд╣реИред

Kotlin Bytecode Viewer рдЙрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЦрдбрд╝реЗ рд╣реИрдВред рдЕрдм рд╣рдо EMPTY_PLUGIN рдкрд░ рдЦрдбрд╝реЗ рд╣реИрдВ, рдФрд░ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдБ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЧреЗрдЯрдЯрд░ рдЕрдм рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗрд╡рд▓ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рд╡рд┐рдШрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ "рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдЕрдВрддрд┐рдо EmptyPlugin EMPTY_PLUGIN" рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдордиреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рд╣реИред рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рднреА рдХреЛ рдкреНрд░рд╕рдиреНрди рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рдВрдХрд▓рдХред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкреАрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рд╕рдВрдХрд▓рдХред
рдЬреЗрдиреЗрд░рд┐рдХреНрд╕
рдЖрдЗрдП рдХреЛрдб рд╕реЗ рдмреНрд░реЗрдХ рд▓реЗрдВ рдФрд░ рдЬреЗрдирд░рд┐рдХ рдХреЛ рджреЗрдЦреЗрдВред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЧрд░реНрдо рд╡рд┐рд╖рдп рд╣реИред рдпрд╛ рдлрд┐рд╕рд▓рди, рдЬреЛ рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╡рд╛ рдХреА рдЕрдкрдиреА рдЬрдЯрд┐рд▓рддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдЯрд▓рд┐рди рдЕрд▓рдЧ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рднрд┐рдиреНрдирддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВред рдпрд╣ рдХреНрдпрд╛ рд╣реИ
рднрд┐рдиреНрдирддрд╛ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдВрдЯреЗрдирд░реЛрдВ рдпрд╛ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдПред рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╢реБ рдФрд░ рдХреБрддреНрддреЗ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣реИрдВ: рдХреБрддреНрддрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рдкрд╢реБ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИ, рддреАрд░ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╕реЗ рдЖрддрд╛ рд╣реИред

рдФрд░ рдЙрдирдХреЗ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХрд╛ рдХреНрдпрд╛ рдХрдиреЗрдХреНрд╢рди рд╣реЛрдЧрд╛? рдЖрдЗрдП рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВред
рдкрд╣рд▓рд╛ Iterator рд╣реИред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ, рд╣рдо рдмрд╛рд░рдмрд░рд╛ рд▓рд┐рд╕реНрдХреЙрд╡ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рдирд┐рдпрдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛрдВрдЧреЗред рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: "рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХреЛрдИ рдХрдо рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред"
рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ Iterator рдХрд░рддреА рд╣реИ рд╡рд╣ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рд╡рд╕реНрддреБрдПрдВ рджреЗрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Animalред рдпрджрд┐ рд╣рдо рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рдХрд╣реАрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрдЯрд░реЗрдЯрд░ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд▓реА () рд╡рд┐рдзрд┐ рд╕реЗ рдПрдирд┐рдорд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрддреНрддрд╛ рднреА рдПрдирд┐рдорд▓ рд╣реИред рд╣рдо рдХрдо рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЕрдзрд┐рдХ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХреБрддреНрддрд╛ рдПрдХ рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реИред

рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ: рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдкрдкреНрд░рдХрд╛рд░ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рдпрд╣рд╛рдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред рдФрд░ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛: рдХрд╛рд░реНрд░рд╡рд╛рдИред рдПрдХреНрд╢рди рдПрдХ рдРрд╕рд╛ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдПрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдпрд╣ рд╣рдорд╕реЗ рдПрдХ рдХреБрддреНрддрд╛ рдпрд╛ рдЬрд╛рдирд╡рд░ рд▓реЗрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдм рд╣рдо рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдХреЛрдИ рдФрд░ рдорд╛рдВрдЧ рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдмрджрд▓ рд░рд╣реА рд╣реИред "рдФрд░ рдирд╣реАрдВ" рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╢реБ (рдПрдХ рдХреБрддреНрддреЗ рд╕реЗ рдХрдо рдЬрд╛рдирд╡рд░) рд╣реИред рдФрд░ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдВрдЯреНрд░рд╛рд╡рд┐рд░реЗрдВрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рддреАрд╕рд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ArrayList, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╣рдо рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдирд┐рдпрдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб (рдПрдХ рдХреБрддреНрддреЗ, рдПрдХ рдЬрд╛рдирд╡рд░ рдирд╣реАрдВ) рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рдореЗрдВ, рдЬрдм рдЗрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 1.5 (рдЬрд╣рд╛рдВ рдЬреЗрдиреЗрд░рд┐рдХ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛) рд╕реЗ рдкрд╣рд▓реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╣рд╡рд░реНрддреА рдмрдирд╛рдпрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдЙрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдХрд╣реАрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡рд╣рд╛рдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреБрд╢ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рд╕рдм рдХреБрдЫ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред
рдХрдбрд╝рд╡реЗ рдЕрдиреБрднрд╡ рд╕реЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдЬреЗрдиреЗрд░рд┐рдХ рдбрд┐рдЬрд╛рдЗрдирд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ "рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛ рджреЗрдВрдЧреЗ, рд╣рдо рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред"
рдФрд░ рдЕрдВрдд рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдмрд╛рдд рдореЗрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдареАрдХ рдирд╣реАрдВ рд╣реИ:
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕ рд╢реАрдЯ рд╕реЗ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдХреБрддреНрддреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдХреНрдпреЛрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ? рдЗрд╕рд▓рд┐рдП, рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдХреНрдпрд╛ рд╣реЛрдЧреА:
List<Dog> dogs = new ArrayList<>(); List<? extends Animal> animals = dogs;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рднрд┐рдиреНрдирддрд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрдЧрд╣ рдкрд░ рдЗрдВрдЧрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо рдХреБрддреНрддреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ-рд╕рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд╛рдЙрдирд╕рд╛рдЗрдб рдХреНрдпрд╛ рд╣реИрдВ? рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрди рдбрд░рд╛рд╡рдиреЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдЯрд▓рд┐рди рдореЗрдВ, рдРрд╕реА рдЪреАрдЬрд╝ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреА рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:
val dogs: List<Dog> = ArrayList() val animals: List<Animal> = dogs
рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ? рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рдХрд┐ рдЪрд╛рджрд░реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд▓рдЧ рд╣реИрдВред рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕реВрдЪреА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рди рдХрд┐ рдЖрд╕рдиреНрдиред рдЗрд╕рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╣рдо рддреБрд░рдВрдд рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдпрд╣рд╛рдВ рд╕реЗ рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреА рдЬрдЧрд╣ рдЖрдЙрдЯ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдШреЛрд╖рдгрд╛ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
interface List<out E> : Collection<E>
рдЗрд╕реЗ рдШреЛрд╖рдгрд╛-рд╕реНрдерд▓ рдкреНрд░рд╕рд░рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдПрдХ рдЬрдЧрд╣ рд╕рдм рдХреБрдЫ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЕрдм рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдирд┐рд╢рдХреНрдд рд╣реИред
рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ
рдЪрд▓реЛ рдЕрдкрдиреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ AddPlugins рд╡рд┐рдзрд┐ рд╣реИ, рдпрд╣ рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ:
@JvmStatic fun addPlugins (plugs: List<Plugin>) { plugs.forEach { addPlugin(it) } } , , List<EmptyPlugin>, , : <source lang="java"> final List<EmptyPlugin> pluginsToSet = Arrays.asList(new LoggerPlugin("Alog"), new SegmentPlugin());
рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд╕реВрдЪреА рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реИ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╣рд╛рдВ рдкреНрд▓рдЧ рд╡рд╛рд░рд┐рд╕ рдХреА рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рдмреБрд░рд╛ рдирд╣реАрдВ рдорд╛рдирддрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдШреЛрд╖рдгрд╛-рд╕рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд╣рд╛рдВ рд╣рдордиреЗ рд╕рдм рдХреБрдЫ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рддрдм рдЙрдкрдпреЛрдЧ рдХреЗ рд╕реНрддрд░ рдкрд░ рдЬрд╛рд╡рд╛ рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдВ рдПрдХ рдкреНрд▓рдЧ рд╢реАрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡рд╣рд╛рдВ рдХреЛрдИ рд╡рд╛рд░рд┐рд╕ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдВрд╢реЛрдзрдХ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛? рдпрд╣ рд╕рд╣реА рд╣реИ, рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд╣реИред рдФрд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ @JvmSuppressWildcards рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рдо рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдкреНрд░рдХрд╛рд░ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рд╣реИред
@JvmStatic fun addPlugins(plugs: List<@JvmSuppressWildcards Plugin>) { plugs.forEach { addPlugin(it) } }
SuppressWildcards рдмреЛрд▓рддреЗ рд╣реБрдП, рд╣рдо рдЗрди рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЛ рджрдмрд╛ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдБ рдХрд┐ рдХреИрд╕реЗ рд╕рдм рдХреБрдЫ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ:

рдореИрдВ рдЕрдм рдХреЛрдб рд╕реЗ рдПрдиреЛрдЯреЗрд╢рди рд╣рдЯрд╛ рджреВрдВрдЧрд╛ред рдпрд╣рд╛рдБ рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рд╣реИред рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреНрд╖рд░рдг рдореМрдЬреВрдж рд╣реИред рдФрд░ рдЖрдкрдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╢реНрди рдереЗ, рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрд╛рдИрдЯреЗрдХреЛрдб рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддрд╛ рд╣реИ: рдФрд░ рдпрд╣ рдкреНрд░рд╢реНрди рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ рд╣реИред

рдЕрдм рд╣рдо рдлрд┐рд░ рд╕реЗ рдПрдиреЛрдЯреЗрд╢рди рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд┐рдирд╛ рдкреВрдЫрддрд╛рдЫ рдХреЗ рд╣рдорд╛рд░рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред

рдЕрдм рд╣рдорд╛рд░рд╛ рдкрд┐рдЫрд▓рд╛ рдХреЛрдб рдареАрдХ рд╕реЗ рд╕рдВрдХрд▓рди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдордиреЗ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПред .
, List . , getPlugins, . ? , , , . , Java.
final List<Plugin> plugins = Analytics.getPlugins(); displayPlugins(plugins); Analytics.getPlugins().add(new EmptyPlugin());
, - , , - . , . , - .
. Kotlin , , , , , wildcards Java. , , . , List, Plugin. , , , : Plugin, .
. , , usecase, - , .
, , , - . , Java. Kotlin List тАФ read only-, , Java тАФ ? , List wildcard. , . @JvmWildcard : , . , Java . Java ┬л ?┬╗:

List<? extends Plugin>, ┬л ?┬╗ , , . script kiddie, ┬л , , , ArrayList, ┬╗. , ArrayList , .
((ArrayList<Plugin>) Analytics.getPlugins()).add(new EmptyPlugin());
, , , defensive-, - . , , , script kiddies .
@JvmStatic fun getPlugins(): List<@JvmWildcard Plugin> = plugin.toImmutableList()
, @JvmSuppressWildcard , , , , .
, . , : .
Java. , :
@Override public void send(@NotNull Event event) throws IOException
:
interface Plugin { fun init() fun send(event: Event)
Kotlin checked exception. : . , , . Java -. : ┬л Throws - , ┬╗:

-, Kotlin? , тАж
@Throws, . throws- . , IOExeption:
open class EmptyPlugin : Plugin { @Throws(IOException::class) override fun send(event: Event) {}
:
interface Plugin { fun init() @Throws(IOException::class) fun send(event: Event)
? , Java, exception, . , . , - , , @JvmName. .
, Java . тАж
package util fun List<Int>.printReversedSum() { println(this.foldRight(0) { it, acc -> it + acc }) } @JvmName("printReversedConcatenation") fun List<String>.printReversedSum() { println(this.foldRight(StringBuilder()) { it, acc -> acc.append(it) }) }
, Java , . , IDE . , ? , , , List, List. , type erasure. :

, , top-level c. printReversedSum List, List. Kotlin- , Java- . , kotlin.jvm , Java , , Kotlin . тАФ , concatenation тАФ , .
. . extension- reverse.
inline fun String.reverse() = StringBuilder(this).reverse().toString() inline fun <reified T> reversedClassName() = T::class.java.simpleName.reverse() inline fun <T> Iterable<T>.forEachReversed(action: (T) -> Unit) { for (element in this.reversed()) action(element) }
reverse , ReverserKt.
private static void useUtils() { System.out.println(ReverserKt.reverse("Test")); SumsKt.printReversedSum(asList(1, 2, 3, 4, 5)); SumsKt.printReversedConcatenation(asList("1", "2", "3", "4", "5")); }
, , . , , Java, - . . ? , @JvmName, , .
, , , , , .
@file:Suppress("NOTHING_TO_INLINE") @file:JvmName("ReverserUtils")
Java ReverserKt, , ReverserUtils . ┬л 2.1┬╗ тАФ , top-level , . , , sums.kt SumsKt, , reversing ReverserUtils. @JvmName, ┬лReverserUtils┬╗, , , , .
, , ┬л , -┬╗. ? @JvmMultifileClass, , , .
"@file:JvmMultifileClass", SumsKt ReverserUtils, тАФ . !
, . , , . , , , @JvmName Kotlin.
Kotlin-
, , . , Kotlin- .
, inline-. Kotlin , , Java ? , , , Java. , , Kotlin-only , dex count limit. Kotlin , .
Reified type parameters. Kotlin, - , Java . Kotlin-only , Kotlin, Java reified, .
java.lang.Class. , Java, . . ┬л Retrofit┬╗, ( , ):
class Retrofit private constructor( val baseUrl: String, val client: Client ) { fun <T : Any> create(service: Class<T>): T {...} fun <T : Any> create(service: KClass<T>): T { return create(service.java) } }
, Java, , KClass, , extension-, KClass Class, Class KClass ( Kotlin, ).
, . Kotlin- KClass, Reified-, :
inline fun <reified T : Any> create(): T { return create(T::class.java.java)
. Kotlin , .
val api = retrofit.create(Api::class) val api = retrofit.create<Api>() , ::class . Reified-, -.
Unit. Unit, , void Java, . . , . - Scala, Scala , - , , , void.
Kotlin . Kotlin 22 , - . , , Unit, void, Unit. . , Unit? , . .
inline fun <T> Iterable<T>.forEachReversed(action: (T) -> Unit) { for (element in this.reversed()) action(element) }
Kotlin: , method reference, , , .
private fun useMisc() { listOf(1, 2, 3, 4).forEachReversed(::println) println(reversedClassName<String>()) }
Java? Java :
private static void useMisc() { final List<Integer> list = asList(1, 2, 3, 4); ReverserUtils.forEachReversed(list, integer -> { System.out.println(integer); return Unit.INSTANCE; });
- , - . Void , . , void, . , , , . , Unit . null, . , .
: Typealiases тАФ , , Kotlin, Java, , , . , - . Java- .
: visibility. , internal visibility. , Kotlin package private, - , public. internal. Internal тАФ , . Retrofit internal- validate.
internal fun validate(): Retrofit { println("!!!!!! internal fun validate() was called !!!!!!") return this }
Kotlin, . Java? validate? , , internal public. , Kotlin bytecode viewer.

public, , , , , , API . - 80 , .
Java :
final Api api = retrofit .validate$production_sources_for_module_library_main() .create(Api.class); api.sendMessage("Hello from Java"); }
. , , , . , let me explain this to you. , ?
final Api api = retrofit .validate$library() .create(Api.class); api.sendMessage("Hello from Java"); }
. ┬л ?┬╗ тАж MAGIC!
, - internal, , API. script kiddie Kotlin Bytecode Viewer, . internal visibility.
, . , ,
, , SkillsMatter. .
, Kotlin-. , - , . Kotlin bytecode viewer .
рдзрдиреНрдпрд╡рд╛рдж!
, : 8-9 Mobius , . тАФ , .