ูƒุชุงุจุฉ ูƒูˆุฏ Kotlin Friendly Java

ู…ู† ุงู„ุฎุงุฑุฌ ุŒ ู‚ุฏ ูŠุจุฏูˆ ุฃู† Kotlin ู‚ุงู… ุจุชุจุณูŠุท ุชุทูˆูŠุฑ Android ุฏูˆู† ุฅุฏุฎุงู„ ุตุนูˆุจุงุช ุฌุฏูŠุฏุฉ ุนู„ู‰ ุงู„ุฅุทู„ุงู‚: ุงู„ู„ุบุฉ ู…ุชูˆุงูู‚ุฉ ู…ุน Java ุŒ ู„ุฐู„ูƒ ูŠู…ูƒู† ุชุฑุฌู…ุฉ ู…ุดุฑูˆุน Java ูƒุจูŠุฑ ุฅู„ูŠู‡ุง ุชุฏุฑูŠุฌูŠู‹ุง ุฏูˆู† ุฅุฒุนุงุฌ ุฃูŠ ุดุฎุต ุŒ ุฃู„ูŠุณ ูƒุฐู„ูƒุŸ ูˆู„ูƒู† ุฅุฐุง ู†ุธุฑุช ุฃุนู…ู‚ ุŒ ูŠูˆุฌุฏ ููŠ ูƒู„ ุตู†ุฏูˆู‚ ู‚ุงุน ู…ุฒุฏูˆุฌ ุŒ ูˆููŠ ุทุงูˆู„ุฉ ุงู„ุฒูŠู†ุฉ ูŠูˆุฌุฏ ุจุงุจ ุณุฑูŠ. ู„ุบุงุช ุงู„ุจุฑู…ุฌุฉ ู‡ูŠ ู…ุดุงุฑูŠุน ู…ุนู‚ุฏุฉ ู„ู„ุบุงูŠุฉ ุจุญูŠุซ ู„ุง ูŠู…ูƒู† ุฏู…ุฌู‡ุง ุจุฏูˆู† ูุฑูˆู‚ ุฏู‚ูŠู‚ุฉ.

ุจุงู„ุทุจุน ุŒ ู‡ุฐุง ู„ุง ูŠุนู†ูŠ ุฃู† "ูƒู„ ุดูŠุก ุณูŠุฆ ูˆู„ุง ุชุญุชุงุฌ ุฅู„ู‰ ุงุณุชุฎุฏุงู… Kotlin ู…ุน Java" ุŒ ูˆู„ูƒู† ู‡ุฐุง ูŠุนู†ูŠ ุฃู†ู‡ ูŠุฌุจ ุนู„ูŠูƒ ู…ุนุฑูุฉ ุงู„ูุฑูˆู‚ ุงู„ุฏู‚ูŠู‚ุฉ ูˆุฃุฎุฐู‡ุง ุจุนูŠู† ุงู„ุงุนุชุจุงุฑ. ููŠ ู…ุคุชู…ุฑ Mobius ู„ุฏูŠู†ุง ุŒ ุชุญุฏุซ ุณูŠุฑุฌูŠ ุฑูŠุงุจูˆู ุนู† ูƒูŠููŠุฉ ูƒุชุงุจุฉ ุงู„ุชุนู„ูŠู…ุงุช ุงู„ุจุฑู…ุฌูŠุฉ ุนู„ู‰ Kotlin ูˆุงู„ุชูŠ ูŠู…ูƒู† ุงู„ูˆุตูˆู„ ุฅู„ูŠู‡ุง ุจุณู‡ูˆู„ุฉ ู…ู† Java. ูˆู‚ุฏ ุฃุญุจ ุงู„ุฌู…ู‡ูˆุฑ ุงู„ุชู‚ุฑูŠุฑ ูƒุซูŠุฑู‹ุง ู„ุฏุฑุฌุฉ ุฃู†ู†ุง ู„ู… ู†ู‚ุฑุฑ ู†ุดุฑ ู…ู‚ุทุน ููŠุฏูŠูˆ ูุญุณุจ ุŒ ุจู„ ุนู…ู„ู†ุง ุฃูŠุถู‹ุง ู†ุณุฎุฉ ู†ุตูŠุฉ ู„ุญุจุฑ:


ู„ู‚ุฏ ูƒู†ุช ุฃูƒุชุจ Kotlin ู„ุฃูƒุซุฑ ู…ู† ุซู„ุงุซ ุณู†ูˆุงุช ุŒ ุงู„ุขู† ูู‚ุท ุนู„ู‰ ุฐู„ูƒ ุŒ ูˆู„ูƒู† ููŠ ุงู„ุจุฏุงูŠุฉ ู‚ู…ุช ุจุณุญุจ Kotlin ุฅู„ู‰ ู…ุดุงุฑูŠุน Java ุงู„ุญุงู„ูŠุฉ. ู„ุฐู„ูƒ ุŒ ุทุฑุญ ุงู„ุณุคุงู„ "ูƒูŠููŠุฉ ุฑุจุท Java ูˆ Kotlin ู…ุนู‹ุง" ููŠ ุทุฑูŠู‚ูŠ ูƒุซูŠุฑู‹ุง.

ููŠ ูƒุซูŠุฑ ู…ู† ุงู„ุฃุญูŠุงู† ุนู†ุฏู…ุง ุชุถูŠู Kotlin ุฅู„ู‰ ู…ุดุฑูˆุน ุŒ ูŠู…ูƒู†ูƒ ุฃู† ุชุฑู‰ ูƒูŠู ...

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' 

ุชูุงุตูŠู„ ุงู„ุนุงู…ูŠู† ุงู„ู…ุงุถูŠูŠู†: ุชูƒุชุณุจ ุงู„ู…ูƒุชุจุงุช ุงู„ุฃูƒุซุฑ ุดุนุจูŠุฉ ุฃุบู„ูุฉ ุจุญูŠุซ ูŠู…ูƒู† ุงุณุชุฎุฏุงู…ู‡ุง ู…ู† Kotlin ุจุดูƒู„ ุงุตุทู„ุงุญูŠ.

ุฅุฐุง ูƒุชุจุช ููŠ Kotlin ุŒ ูุฃู†ุช ุชุนู„ู… ุฃู† ู‡ู†ุงูƒ ูˆุธุงุฆู ู…ู„ุญู‚ ุฑุงุฆุนุฉ ุŒ ูˆูˆุธุงุฆู ู…ุถู…ู†ุฉ ุŒ ูˆุชุนุจูŠุฑุงุช lambda ู…ุชูˆูุฑุฉ ู…ู† Java 6. ูˆู‡ุฐุง ุฑุงุฆุน ุŒ ูŠุฌุฐุจู†ุง ุฅู„ู‰ Kotlin ุŒ ูˆู„ูƒู† ุงู„ุณุคุงู„ ุงู„ุฐูŠ ูŠุทุฑุญ ู†ูุณู‡. ุชุนุฏ ุฅู…ูƒุงู†ูŠุฉ ุงู„ุชุดุบูŠู„ ุงู„ุชูุงุนู„ูŠ ู…ุน Java ูˆุงุญุฏุฉ ู…ู† ุฃูƒุจุฑ ู…ูŠุฒุงุช ุงู„ู„ุบุฉ ูˆุฃูƒุซุฑู‡ุง ุดูŠูˆุนู‹ุง. ุฅุฐุง ูƒู†ุช ุชุฃุฎุฐ ููŠ ุงู„ุงุนุชุจุงุฑ ุฌู…ูŠุน ุงู„ู…ูŠุฒุงุช ุงู„ู…ุฏุฑุฌุฉ ุŒ ูู„ู…ุงุฐุง ู„ุง ุชูƒุชุจ ู…ูƒุชุจุงุช ูู‚ุท ููŠ KotlinุŸ ุณูŠุนู…ู„ูˆู† ุฌู…ูŠุนู‹ุง ุจุดูƒู„ ู…ุซุงู„ูŠ ุฎุงุฑุฌ ุงู„ุตู†ุฏูˆู‚ ู…ุน Java ุŒ ูˆู„ู† ุชุญุชุงุฌ ุฅู„ู‰ ุฏุนู… ูƒู„ ู‡ุฐู‡ ุงู„ุฃุบู„ูุฉ ุŒ ุณูŠูƒูˆู† ุงู„ุฌู…ูŠุน ุณุนุฏุงุก ูˆู…ุญุชูˆู‰.

ูˆู„ูƒู† ุŒ ุจุงู„ุทุจุน ุŒ ู…ู† ุงู„ู†ุงุญูŠุฉ ุงู„ุนู…ู„ูŠุฉ ุŒ ู„ูŠุณ ูƒู„ ุดูŠุก ูˆุฑุฏูŠู‹ุง ูƒู…ุง ู‡ูˆ ุงู„ุญุงู„ ููŠ ุงู„ูƒุชูŠุจุงุช ุŒ ู‡ู†ุงูƒ ุฏุงุฆู…ู‹ุง "ุณู…ุฉ ุฎุท ุตุบูŠุฑ" ุŒ ูˆู‡ู†ุงูƒ ุญูˆุงู ุญุงุฏุฉ ุนู†ุฏ ุชู‚ุงุทุน Kotlin ูˆ Java ุŒ ูˆุงู„ูŠูˆู… ุณู†ุชุญุฏุซ ุนู† ู‡ุฐุง ู‚ู„ูŠู„ุงู‹.

ุญูˆุงู ุญุงุฏุฉ


ู„ู†ุจุฏุฃ ุจุงู„ุงุฎุชู„ุงูุงุช. ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ู‡ู„ ุชุนู„ู… ุฃู†ู‡ ููŠ Kotlin ู„ุง ุชูˆุฌุฏ ูƒู„ู…ุงุช ุฑุฆูŠุณูŠุฉ ู…ุชู‚ู„ุจุฉ ุŒ ู…ุชุฒุงู…ู†ุฉ ุŒ ุตุงุฑู…ุฉ ุŒ ุนุงุจุฑุฉุŸ ูŠุชู… ุงุณุชุจุฏุงู„ู‡ุง ุจุชุนู„ูŠู‚ุงุช ู…ู† ู†ูุณ ุงู„ุงุณู… ู…ูˆุฌูˆุฏุฉ ููŠ ุญุฒู…ุฉ kotlin.jvm. ู„ุฐุง ุŒ ูุฅู† ู…ุนุธู… ุงู„ุญุฏูŠุซ ูŠุฏูˆุฑ ุญูˆู„ ู…ุญุชูˆูŠุงุช ู‡ุฐู‡ ุงู„ุญุฒู…ุฉ.

ู‡ู†ุงูƒ ุงู„ุฃุฎุดุงุจ - ู…ุซู„ ุชุฌุฑูŠุฏ ุงู„ู…ูƒุชุจุฉ ุนู„ู‰ ู‚ุทุน ุงู„ุฃุดุฌุงุฑ ู…ู† ุฒูŠูƒุง ูุงุฑุชุงู†ูˆู ุณูŠุฆ ุงู„ุณู…ุนุฉ. ูŠุณู…ุญ ู„ูƒ ุจุงุณุชุฎุฏุงู…ู‡ ููŠ ูƒู„ ู…ูƒุงู† ููŠ ุชุทุจูŠู‚ูƒ ุŒ ูˆูŠุชุญูˆู„ ูƒู„ ุดูŠุก ุชุฑูŠุฏ ุฅุฑุณุงู„ ุงู„ุณุฌู„ุงุช ููŠู‡ (ุฅู„ู‰ logcat ุŒ ุฃูˆ ุฅู„ู‰ ุฎุงุฏู…ูƒ ู„ู„ุชุญู„ูŠู„ ุŒ ุฃูˆ ุงู„ุฅุจู„ุงุบ ุนู† ุงู„ุฃุนุทุงู„ ุŒ ูˆู…ุง ุฅู„ู‰ ุฐู„ูƒ) ุฅู„ู‰ ู…ูƒูˆู†ุงุช ุฅุถุงููŠุฉ.

ุฏุนูˆู†ุง ู†ุชุฎูŠู„ ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุฃู†ู†ุง ู†ุฑูŠุฏ ูƒุชุงุจุฉ ู…ูƒุชุจุฉ ู…ู…ุงุซู„ุฉ ุŒ ูู‚ุท ู„ู„ุชุญู„ูŠู„ุงุช. ููƒ ุงู„ุงุฑุชุจุงุท ุฃูŠุถู‹ุง.

 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() ) 

ู†ุฃุฎุฐ ู†ูุณ ู†ู…ุท ุงู„ุจู†ุงุก ุŒ ู„ุฏูŠู†ุง ู†ู‚ุทุฉ ุฏุฎูˆู„ ูˆุงุญุฏุฉ - ู‡ุฐุง ู‡ูˆ Analytics. ูŠู…ูƒู†ู†ุง ุฅุฑุณุงู„ ุงู„ุฃุญุฏุงุซ ู‡ู†ุงูƒ ูˆุฅุถุงูุฉ ุงู„ุฅุถุงูุงุช ูˆู…ุนุฑูุฉ ู…ุง ุฃุถูู†ุงู‡ ุจุงู„ูุนู„ ู‡ู†ุงูƒ.

ุงู„ุจุฑู†ุงู…ุฌ ุงู„ู…ุณุงุนุฏ ู‡ูˆ ูˆุงุฌู‡ุฉ ุงู„ุจุฑู†ุงู…ุฌ ุงู„ู…ุณุงุนุฏ ุงู„ุฐูŠ ูŠู„ุฎุต API ุชุญู„ูŠู„ูŠ ู…ุนูŠู†.

ูˆููŠ ุงู„ูˆุงู‚ุน ุŒ ุชุญุชูˆูŠ ูุฆุฉ ุงู„ุฃุญุฏุงุซ ุนู„ู‰ ุงู„ู…ูุชุงุญ ูˆุณู…ุงุชู†ุง ุงู„ุชูŠ ู†ุฑุณู„ู‡ุง. ู„ุง ูŠุชุนู„ู‚ ุงู„ุชู‚ุฑูŠุฑ ู‡ู†ุง ุจู…ุง ุฅุฐุง ูƒุงู† ุงู„ุฃู…ุฑ ูŠุณุชุญู‚ ุงุณุชุฎุฏุงู… ุงู„ุฃุบุงู†ูŠ ุงู„ูุฑุฏูŠุฉ ุŒ ู„ุฐู„ูƒ ุฏุนูˆู†ุง ู„ุง ู†ูˆู„ุฏ holivar ุŒ ู„ูƒู†ู†ุง ุณู†ุดุงู‡ุฏ ูƒูŠููŠุฉ ุชู…ุดูŠุท ู‡ุฐุง ุงู„ุดูŠุก ุจุฃูƒู…ู„ู‡.

ุงู„ุขู† ุงู„ุบูˆุต ู‚ู„ูŠู„ุง. ููŠู…ุง ูŠู„ูŠ ู…ุซุงู„ ุนู„ู‰ ุงุณุชุฎุฏุงู… ู…ูƒุชุจุชู†ุง ููŠ Kotlin:

 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) // dry-run Analytics.addPlugins(listOf(LoggerPlugin("ALog"), SegmentPlugin))) val plugins = Analytics.getPlugins() // ... } 

ู…ู† ุญูŠุซ ุงู„ู…ุจุฏุฃ ุŒ ูŠุจุฏูˆ ูƒู…ุง ู‡ูˆ ู…ุชูˆู‚ุน. ู†ู‚ุทุฉ ุฏุฎูˆู„ ูˆุงุญุฏุฉ ุŒ ูˆุชุณู…ู‰ ุงู„ุฃุณุงู„ูŠุจ ู„ุง statics. ุญุฏุซ ุจุฏูˆู† ู…ุนู„ู…ุงุช ุŒ ุญุฏุซ ุฐูˆ ุณู…ุงุช. ู†ุชุญู‚ู‚ ู„ู…ุนุฑูุฉ ู…ุง ุฅุฐุง ูƒุงู† ู„ุฏูŠู†ุง ู…ูƒูˆู†ุงุช ุฅุถุงููŠุฉ ุŒ ู†ุฏูุน ู…ูƒูˆู‘ู†ู‹ุง ุฅุถุงููŠู‹ุง ูุงุฑุบู‹ุง ู…ู† ุฃุฌู„ ุชู†ููŠุฐ ู†ูˆุน ู…ู† "ุงู„ุชุดุบูŠู„ ุงู„ุฌุงู". ุฃูˆ ุฃุถู ุจุนุถ ุงู„ู…ูƒูˆู†ุงุช ุงู„ุฅุถุงููŠุฉ ุงู„ุฃุฎุฑู‰ ูˆุงุนุฑุถู‡ุง ูˆู…ุง ุฅู„ู‰ ุฐู„ูƒ. ุจุดูƒู„ ุนุงู… ุŒ ุญุงู„ุงุช ุงู„ู…ุณุชุฎุฏู…ูŠู† ุงู„ู‚ูŠุงุณูŠุฉ ุŒ ุขู…ู„ ุฃู† ูŠูƒูˆู† ูƒู„ ุดูŠุก ูˆุงุถุญู‹ุง ุญุชู‰ ุงู„ุขู†.

ุงู„ุขู† ุฏุนูˆู†ุง ู†ุฑู‰ ู…ุง ูŠุญุฏุซ ููŠ ุฌุงูุง ุนู†ุฏู…ุง ู†ูุนู„ ุงู„ุดูŠุก ู†ูุณู‡:

 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()); // dry-run final List<EmptyPlugin> pluginsToSet = Arrays.asList(new LoggerPlugin("ALog"), new SegmentPlugin()); // ... } 

ุชู†ุฏู„ุน ุงู„ุถุฌุฉ ู…ุน INSTANCE ุนู„ู‰ ุงู„ููˆุฑ ููŠ ุนูŠู†ูŠ ุŒ ูˆู‡ูŠ ู…ู…ุชุฏุฉ ุŒ ูˆูˆุฌูˆุฏ ู‚ูŠู… ุตุฑูŠุญุฉ ู„ู„ู…ุนู„ู…ุฉ ุงู„ุงูุชุฑุงุถูŠุฉ ู…ุน ุงู„ุณู…ุงุช ุŒ ูˆุจุนุถ ุงู„ุญุฑูˆู ุจุฃุณู…ุงุก ุบุจูŠุฉ. ู†ุธุฑู‹ุง ู„ุฃู†ู†ุง ุจุดูƒู„ ุนุงู… ุŒ ุงุฌุชู…ุนู†ุง ู‡ู†ุง ู„ุชุญูˆูŠู„ ู‡ุฐุง ุฅู„ู‰ ุดูŠุก ู…ุดุงุจู‡ ู„ู„ู…ู„ู ุงู„ุณุงุจู‚ ู…ุน Kotlin ุŒ ูู„ู†ู†ุชู‚ู„ ููŠ ูƒู„ ู„ุญุธุฉ ู„ุง ู†ุญุจู‡ุง ูˆู†ุญุงูˆู„ ุชูƒูŠูŠูู‡ุง ุจุทุฑูŠู‚ุฉ ุฃูˆ ุจุฃุฎุฑู‰.

ู„ู†ุจุฏุฃ ุจุงู„ุญุฏุซ. ู†ู‚ูˆู… ุจุฅุฒุงู„ุฉ ุงู„ู…ุนู„ู…ุฉ Colletions.emptyMap () ู…ู† ุงู„ุณุทุฑ ุงู„ุซุงู†ูŠ ุŒ ูˆูŠุธู‡ุฑ ุฎุทุฃ ู…ุชุฑุฌู…. ู…ุง ุณุจุจ ุฐู„ูƒุŸ

 data class Event( val name: String, val context: Map<String, Any> = emptyMap() ) 

ูŠุญุชูˆูŠ ู…ูู†ุดุฆู†ุง ุนู„ู‰ ู…ุนู„ู…ุฉ ุงูุชุฑุงุถูŠุฉ ู†ู…ุฑุฑ ุงู„ู‚ูŠู…ุฉ ุฅู„ูŠู‡ุง. ู†ุฃุชูŠ ู…ู† Java ุฅู„ู‰ Kotlin ุŒ ูู…ู† ุงู„ู…ู†ุทู‚ูŠ ุฃู† ู†ูุชุฑุถ ุฃู† ูˆุฌูˆุฏ ู…ุนู„ู…ุฉ ุงูุชุฑุงุถูŠุฉ ูŠูˆู„ุฏ ู…ู†ุดุฆูŠู†: ูˆุงุญุฏ ู…ู…ุชู„ุฆ ุจู…ุนู„ู…ุชูŠู† ุŒ ูˆูˆุงุญุฏ ุฌุฒุฆูŠ ุŒ ูŠู…ูƒู† ุชุญุฏูŠุฏ ุงู„ุงุณู… ูู‚ุท. ู…ู† ุงู„ูˆุงุถุญ ุฃู† ุงู„ู…ุชุฑุฌู… ู„ุง ูŠุนุชู‚ุฏ ุฐู„ูƒ. ุฏุนูˆู†ุง ู†ุฑู‰ ู„ู…ุงุฐุง ูŠุนุชู‚ุฏ ุฃู†ู†ุง ู…ุฎุทุฆูˆู†.

ุฃุฏุงุชู†ุง ุงู„ุฑุฆูŠุณูŠุฉ ู„ุชุญู„ูŠู„ ุฌู…ูŠุน ุงู„ุชู‚ู„ุจุงุช ูˆุงู„ุงู†ุนุทุงูุงุช ู„ูƒูŠููŠุฉ ุชุญูˆูŠู„ Kotlin ุฅู„ู‰ JVM bytecode - Kotlin Bytecode Viewer. ููŠ Android Studio ูˆ IntelliJ IDEA ุŒ ูŠู‚ุน ููŠ ู‚ุงุฆู…ุฉ Tools - Kotlin - Show Kotlin Bytecode. ูŠู…ูƒู†ูƒ ุจุจุณุงุทุฉ ุงู„ุถุบุท ุนู„ู‰ Cmd + Shift + A ูˆูƒุชุงุจุฉ Kotlin Bytecode ููŠ ุดุฑูŠุท ุงู„ุจุญุซ.



ู‡ู†ุง ุŒ ุจุดูƒู„ ู…ุฏู‡ุด ุŒ ู†ุฑู‰ ุฑู…ุฒู‹ุง ุซุงู†ูˆูŠู‹ุง ู„ู…ุง ูŠุชุญูˆู„ ุฅู„ูŠู‡ ูุตู„ Kotlin. ู„ุง ุฃุชูˆู‚ุน ุฃู† ูŠูƒูˆู† ู„ุฏูŠูƒ ู…ุนุฑูุฉ ู…ู…ุชุงุฒุฉ ุจุงู„ุจุงูŠุช ูƒูˆุฏ ุŒ ูˆุงู„ุฃู‡ู… ู…ู† ุฐู„ูƒ ุŒ ู„ุง ูŠุชูˆู‚ุน ู…ุทูˆุฑูˆ IDE ุฐู„ูƒ ุฃูŠุถู‹ุง. ู„ุฐู„ูƒ ุŒ ุฌุนู„ูˆุง ุฒุฑ Decompile.

ุจุนุฏ ุงู„ู†ู‚ุฑ ููˆู‚ู‡ ุŒ ู†ุฑู‰ ุฑู…ุฒ Java ุฌูŠุฏู‹ุง ุชู‚ุฑูŠุจู‹ุง:

 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; } // $FF: Synthetic method public Event(String var1, Map var2, int var3, DefaultConstructorMarker var4) { if ((var3 & 2) != 0) { var2 = MapsKt.emptyMap(); } // ... } 

ู†ุฑู‰ ุญู‚ูˆู„ู†ุง ุŒ getters ุŒ ุงู„ู…ู†ุดุฆ ุงู„ู…ุชูˆู‚ุน ู…ุน ู…ุนู„ู…ุชูŠู† ูˆุณูŠุงู‚ ุŒ ูƒู„ ุดูŠุก ูŠุญุฏุซ ุจุดูƒู„ ุฌูŠุฏ. ูˆููŠู…ุง ูŠู„ูŠ ู†ุฑู‰ ุงู„ู…ูู†ุดุฆ ุงู„ุซุงู†ูŠ ุŒ ูˆู‡ู†ุง ู…ุน ุชูˆู‚ูŠุน ุบูŠุฑ ู…ุชูˆู‚ุน: ู„ูŠุณ ุจู…ุนู„ู…ุฉ ูˆุงุญุฏุฉ ุŒ ูˆู„ูƒู† ู„ุณุจุจ ู…ุง ู…ุน ุฃุฑุจุนุฉ.

ู‡ู†ุง ูŠู…ูƒู†ูƒ ุฃู† ุชุดุนุฑ ุจุงู„ุญุฑุฌ ุŒ ูˆู„ูƒู† ูŠู…ูƒู†ูƒ ุฃู† ุชุชุณู„ู‚ ุฃุนู…ู‚ ู‚ู„ูŠู„ุงู‹ ูˆุชูุชุด. ุจุฏุงูŠุฉ ู…ู† ุงู„ูู‡ู… ุŒ ุณูˆู ู†ูู‡ู… ุฃู† DefaultConstructorMarker ู‡ูŠ ูุฆุฉ ุฎุงุตุฉ ู…ู† ู…ูƒุชุจุฉ Kotlin ุงู„ู‚ูŠุงุณูŠุฉ ุŒ ุชู…ุช ุฅุถุงูุชู‡ุง ู‡ู†ุง ุญุชู‰ ู„ุง ูŠูƒูˆู† ู‡ู†ุงูƒ ุชุนุงุฑุถ ู…ุน ุงู„ู…ู†ุดุฆูŠู† ุงู„ู…ูƒุชูˆุจูŠู† ุŒ ุญูŠุซ ู„ุง ูŠู…ูƒู†ู†ุง ุชุนูŠูŠู† ู…ุนู„ู…ุฉ ู†ูˆุน DefaultConstructorMarker ุจุฃูŠุฏูŠู†ุง. ูˆุงู„ุดูŠุก ุงู„ู…ุซูŠุฑ ู„ู„ุงู‡ุชู…ุงู… ุญูˆู„ int var3 ู‡ูˆ ู‚ู†ุงุน ุงู„ุจุช ู„ู„ู‚ูŠู… ุงู„ุงูุชุฑุงุถูŠุฉ ุงู„ุชูŠ ูŠุฌุจ ุฃู† ู†ุณุชุฎุฏู…ู‡ุง. ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ุŒ ุฅุฐุง ูƒุงู† ู‚ู†ุงุน ุงู„ุจุช ูŠุชุทุงุจู‚ ู…ุน ุงู„ุงุซู†ูŠู† ุŒ ูุฅู†ู†ุง ู†ุนู„ู… ุฃู†ู‡ ู„ู… ูŠุชู… ุชุนูŠูŠู† var2 ุŒ ูˆู„ู… ูŠุชู… ุชุนูŠูŠู† ุณู…ุงุชู†ุง ุŒ ูˆู†ุณุชุฎุฏู… ุงู„ู‚ูŠู…ุฉ ุงู„ุงูุชุฑุงุถูŠุฉ.

ูƒูŠู ู†ุตู„ุญ ุงู„ูˆุถุนุŸ ู„ู„ู‚ูŠุงู… ุจุฐู„ูƒ ุŒ ู‡ู†ุงูƒ ุชุนู„ูŠู‚ ุชูˆุถูŠุญูŠ ุฎุงุฑู‚JvmOverloads ู…ู† ุงู„ุญุฒู…ุฉ ุงู„ุชูŠ ุชุญุฏุซุช ุนู†ู‡ุง ุจุงู„ูุนู„. ุนู„ูŠู†ุง ุฃู† ู†ุนู„ู‚ู‡ุง ุนู„ู‰ ุงู„ู…ู†ุดุฆ.

 data class Event @JvmOverloads constructor( val name: String, val context: Map<String, Any> = emptyMap() ) 

ูˆู…ุงุฐุง ุณุชูุนู„ุŸ ุฏุนูˆู†ุง ู†ู†ุชู‚ู„ ุฅู„ู‰ ู†ูุณ ุงู„ุฃุฏุงุฉ. ุงู„ุขู† ู†ุฑู‰ ู…ู†ุดุฆู†ุง ุงู„ูƒุงู…ู„ ุŒ ูˆู…ู†ุดุฆ ู…ุน DefaultConstructorMarker ุŒ ูˆ ุŒ ูˆู‡ุง ุŒ ู…ู†ุดุฆ ุจู…ุนู„ู…ุฉ ูˆุงุญุฏุฉ ุŒ ูˆู‡ูˆ ู…ุชุงุญ ุงู„ุขู† ู…ู† Java:

 @JvmOverloads public Event(@NotNull String name) { this.name, (Map)null, 2, (DefaultConstructorMarker)null); } 

ูˆูƒู…ุง ุชุฑูˆู† ุŒ ูุฅู†ู‡ ูŠููˆุถ ูƒู„ ุงู„ุนู…ู„ ู…ุน ุงู„ู…ุนู„ู…ุงุช ุงู„ุงูุชุฑุงุถูŠุฉ ุฅู„ู‰ ู…ูู†ุดุฆู†ุง ุจุงุณุชุฎุฏุงู… ุฃู‚ู†ุนุฉ ุงู„ุจุช. ูˆุจุงู„ุชุงู„ูŠ ุŒ ู†ุญู† ู„ุง ู†ู†ุชุฌ ู…ุนู„ูˆู…ุงุช ุญูˆู„ ุงู„ู‚ูŠู…ุฉ ุงู„ุงูุชุฑุงุถูŠุฉ ุงู„ุชูŠ ู†ุญุชุงุฌ ุฅู„ู‰ ูˆุถุนู‡ุง ู‡ู†ุงูƒ ุŒ ู†ุญู† ูู‚ุท ู†ููˆุถ ูƒู„ ุดูŠุก ููŠ ู…ูู†ุดุฆ ูˆุงุญุฏ. ุฌู…ูŠู„ ู†ุชุญู‚ู‚ ู…ู…ุง ู†ุญุตู„ ุนู„ูŠู‡ ู…ู† ุฌุงู†ุจ ุฌุงูุง: ุงู„ู…ุชุฑุฌู… ุณุนูŠุฏ ูˆุบูŠุฑ ุบุงุถุจ.

ุฏุนูˆู†ุง ู†ุฑู‰ ู…ุง ู„ุง ู†ุญุจู‡ ุจุนุฏ ุฐู„ูƒ. ู†ุญู† ู„ุง ู†ุญุจ ู‡ุฐุง INSTANCE ุŒ ุงู„ุฐูŠ ูŠุนุชุจุฑ ู‚ุงุณูŠู‹ุง ุจุงู„ู„ูˆู† ุงู„ุฃุฑุฌูˆุงู†ูŠ. ุฃู†ุง ู„ุง ุฃุญุจ ุงู„ู„ูˆู† ุงู„ุฃุฑุฌูˆุงู†ูŠ :)



ุฏุนูˆู†ุง ุชุญู‚ู‚ ุŒ ุจุณุจุจ ู…ุง ุงุชุถุญ. ุฏุนูˆู†ุง ู†ู„ู‚ูŠ ู†ุธุฑุฉ ุนู„ู‰ ุงู„ุฑู…ุฒ ุงู„ุซุงู†ูˆูŠ ู…ุฑุฉ ุฃุฎุฑู‰.

ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ู†ุณู„ุท ุงู„ุถูˆุก ุนู„ู‰ ุฏุงู„ุฉ init ูˆู†ุชุฃูƒุฏ ู…ู† ุฃู† init ุชูƒูˆู† ุจุงู„ูุนู„ ุบูŠุฑ ุซุงุจุชุฉ.



ุฃูŠ ุŒ ู…ู‡ู…ุง ูŠู‚ูˆู„ ุงู„ู…ุฑุก ุŒ ู†ุญุชุงุฌ ุฅู„ู‰ ุงู„ุนู…ู„ ู…ุน ู…ุซูŠู„ ู…ู† ู‡ุฐุง ุงู„ูุตู„ ูˆู†ุทู„ู‚ ุนู„ูŠู‡ ู‡ุฐู‡ ุงู„ุฃุณุงู„ูŠุจ. ูˆู„ูƒู† ูŠู…ูƒู†ู†ุง ุฃู† ู†ุฌุจุฑ ุฌูŠู„ ูƒู„ ู‡ุฐู‡ ุงู„ุฃุณุงู„ูŠุจ ุนู„ู‰ ุฃู† ุชูƒูˆู† ุซุงุจุชุฉ. ู‡ู†ุงูƒ ุชุนู„ูŠู‚ ุชูˆุถูŠุญูŠ ุฑุงุฆุนJvmStatic ู„ู‡ุฐุง ุงู„ุบุฑุถ. ุฏุนู†ุง ู†ุถูŠูู‡ ุฅู„ู‰ ุงู„ุชู‡ูŠุฆุฉ ูˆุฅุฑุณุงู„ ุงู„ูˆุธุงุฆู ูˆุงู„ุชุญู‚ู‚ ู…ู…ุง ูŠููƒุฑ ููŠู‡ ุงู„ู…ุชุฑุฌู… ุงู„ุขู†.

ู†ุฑู‰ ุฃู†ู‡ ุชู…ุช ุฅุถุงูุฉ ุงู„ูƒู„ู…ุฉ ุงู„ุฑุฆูŠุณูŠุฉ ุงู„ุซุงุจุชุฉ ุฅู„ู‰ ุงู„ุญุฑู ุงู„ุชู‡ูŠุฆุฉ ุงู„ู†ู‡ุงุฆูŠุฉ ุงู„ุนุงู…ุฉ () ุŒ ูˆุฃู†ู‚ุฐู†ุง ุฃู†ูุณู†ุง ู…ู† ุงู„ุนู…ู„ ู…ุน INSTANCE. ุณูˆู ู†ุชุญู‚ู‚ ู…ู† ุฐู„ูƒ ููŠ ูƒูˆุฏ Java.

ูŠุฎุจุฑู†ุง ุงู„ู…ุชุฑุฌู… ุงู„ุขู† ุฃู†ู†ุง ู†ุณุชุฏุนูŠ ุงู„ุทุฑูŠู‚ุฉ ุงู„ุซุงุจุชุฉ ู…ู† ุณูŠุงู‚ INSTANCE. ูŠู…ูƒู† ุชุตุญูŠุญ ู‡ุฐุง: ุงุถุบุท ุนู„ู‰ Alt + Enter ุŒ ูˆุญุฏุฏ "Cleanup Code" ุŒ ูˆููˆูŠู„ุง ุŒ ูŠุฎุชููŠ INSTANCE ุŒ ูƒู„ ุดูŠุก ูŠุจุฏูˆ ูƒู…ุง ูƒุงู† ููŠ Kotlin:

  Analytics.send(new Event("only_name_event")); 

ุงู„ุขู† ู„ุฏูŠู†ุง ู…ุฎุทุท ู„ู„ุนู…ู„ ู…ุน ุงู„ุฃุณุงู„ูŠุจ ุงู„ุซุงุจุชุฉ. ุฃุถู ู‡ุฐุง ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ุฃูŠู†ู…ุง ูŠู‡ู…ู†ุง:



ูˆุงู„ุชุนู„ูŠู‚: ุฅุฐุง ูƒุงู†ุช ุงู„ุฃุณุงู„ูŠุจ ุงู„ุชูŠ ู„ุฏูŠู†ุง ู‡ูŠ ุจุงู„ุทุจุน ุทุฑู‚ ุงู„ู…ุซูŠู„ ุŒ ูุนู†ุฏุฆุฐ ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ู…ุน ุงู„ุฎุตุงุฆุต ุŒ ู„ูŠุณ ูƒู„ ุดูŠุก ูˆุงุถุญู‹ุง ุฌุฏู‹ุง. ูŠุชู… ุฅู†ุดุงุก ุงู„ุญู‚ูˆู„ ู†ูุณู‡ุง (ู…ุซู„ ุงู„ู…ูƒูˆู†ุงุช ุงู„ุฅุถุงููŠุฉ) ุนู„ู‰ ุฃู†ู‡ุง ุซุงุจุชุฉ. ูˆู„ูƒู† ูŠุนู…ู„ ุงู„ู…ุณุชูˆุทู†ูˆู† ูˆุงู„ู…ุณุชูˆุทู†ูˆู† ูƒุทุฑู‚ ุงู„ู…ุซุงู„. ู„ุฐู„ูƒ ุŒ ุจุงู„ู†ุณุจุฉ ู„ู„ู…ู…ุชู„ูƒุงุช ุŒ ุชุญุชุงุฌ ุฃูŠุถู‹ุง ุฅู„ู‰ ุฅุถุงูุฉ ู‡ุฐุง ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ู„ุฌุนู„ ุงู„ู…ุณุชูˆุทู†ูŠู† ูˆุงู„ุฑุณูˆู…ุงุช ุซุงุจุชุฉ. ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ู†ุฑู‰ ุงู„ู…ุชุบูŠุฑ isInited ุŒ ุฃุถู ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠJvmStatic ุฅู„ูŠู‡ ุŒ ูˆุงู„ุขู† ู†ุฑู‰ ููŠ ุนุงุฑุถ Kotlin Bytecode ุฃู† ุทุฑูŠู‚ุฉ isInited () ุฃุตุจุญุช ุซุงุจุชุฉ ุŒ ูƒู„ ุดูŠุก ุนู„ู‰ ู…ุง ูŠุฑุงู….

ุงู„ุขู† ุฏุนู†ุง ู†ู†ุชู‚ู„ ุฅู„ู‰ ูƒูˆุฏ Java ุŒ "ู„ู„ุชู†ุธูŠู" ุŒ ูˆูƒู„ ุดูŠุก ูŠุจุฏูˆ ู…ุซู„ Kotlin ุŒ ุจุงุณุชุซู†ุงุก ุงู„ูุงุตู„ุฉ ุงู„ู…ู†ู‚ูˆุทุฉ ูˆูƒู„ู…ุฉ ุฌุฏูŠุฏุฉ - ุญุณู†ู‹ุง ุŒ ู„ู† ุชุชุฎู„ุต ู…ู†ู‡ุง.

 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()); // dry-run // ... } 

ุงู„ุฎุทูˆุฉ ุงู„ุชุงู„ูŠุฉ: ู†ุฑู‰ ู‡ุฐุง getHasPlugins getter ู…ุน ุงู„ุจุงุฏุฆุงุช ููŠ ูˆู‚ุช ูˆุงุญุฏ. ุจุงู„ุทุจุน ุŒ ู„ุณุช ุฎุจูŠุฑู‹ุง ูƒุจูŠุฑู‹ุง ููŠ ุงู„ู„ุบุฉ ุงู„ุฅู†ุฌู„ูŠุฒูŠุฉ ุŒ ูˆู„ูƒู† ูŠุจุฏูˆ ู„ูŠ ุฃู† ู‡ู†ุงูƒ ุดูŠุฆู‹ุง ุขุฎุฑ ุถู…ู†ูŠู‹ุง ู‡ู†ุง. ู„ู…ุงุฐุง ูŠุญุฏุซ ู‡ุฐุงุŸ

ูƒู…ุง ุนุฑููˆุง ุนู† ูƒุซุจ ู…ุน Kotlin ุŒ ุจุงู„ู†ุณุจุฉ ู„ุฃุณู…ุงุก ุงู„ุนู‚ุงุฑุงุช ุงู„ุฎุงุตุฉ ุจุงู„ุฑุณุงู„ุฉ ูˆุงู„ู…ุณุชูˆุทู†ูŠู† ูŠุชู… ุฅู†ุดุงุคู‡ุง ูˆูู‚ู‹ุง ู„ู‚ูˆุงุนุฏ JavaBeans. ู‡ุฐุง ูŠุนู†ูŠ ุฃู† ุงู„ุญุฑูˆู ุณุชูƒูˆู† ุจุดูƒู„ ุนุงู… ู…ุน ุจุงุฏุฆุงุช ุงู„ุญุตูˆู„ ุŒ ูˆุงู„ุจุณุท ู…ุน ุจุงุฏุฆุงุช ู…ุญุฏุฏุฉ. ูˆู„ูƒู† ู‡ู†ุงูƒ ุงุณุชุซู†ุงุก ูˆุงุญุฏ: ุฅุฐุง ูƒุงู† ู„ุฏูŠูƒ ุญู‚ู„ ู…ู†ุทู‚ูŠ ูˆุงุณู…ู‡ ูŠุญุชูˆูŠ ุนู„ู‰ ุงู„ุจุงุฏุฆุฉ ุŒ ูุณูŠุชู… ุงู„ุจุฏุก ุจู€ getter. ูŠู…ูƒู† ุฑุคูŠุฉ ุฐู„ูƒ ููŠ ู…ุซุงู„ ุญู‚ู„ isInited ุฃุนู„ุงู‡.

ู„ุณูˆุก ุงู„ุญุธ ุŒ ูŠุฌุจ ุฃู† ูŠุชู… ุงุณุชุฏุนุงุก ุงู„ุญู‚ูˆู„ ุงู„ู…ู†ุทู‚ูŠุฉ ุจุนูŠุฏู‹ุง ุฏุงุฆู…ู‹ุง. ู„ุง ูŠุฑุถูŠ isPlugins ุชู…ุงู…ู‹ุง ู…ุง ู†ุฑูŠุฏ ุฃู† ู†ุธู‡ุฑู‡ ุฏู„ุงู„ุฉ ุจุงู„ุงุณู…. ูƒูŠู ู†ูƒูˆู†ุŸ

ูˆู‡ุฐุง ู„ูŠุณ ุตุนุจู‹ุง ุจุงู„ู†ุณุจุฉ ู„ู†ุง ุŒ ู„ุฃู† ู‡ุฐุง ู‡ูˆ ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ุงู„ุฎุงุต ุจู†ุง (ูƒู…ุง ูู‡ู…ุช ุจุงู„ูุนู„ ุŒ ุณุฃูƒุฑุฑ ู‡ุฐุง ูƒุซูŠุฑู‹ุง ุงู„ูŠูˆู…). ูŠุณู…ุญ ู„ูƒ ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠJvmName ุจุชุญุฏูŠุฏ ุฃูŠ ุงุณู… ู†ุฑูŠุฏู‡ (ู…ุฏุนูˆู… ุจุดูƒู„ ุทุจูŠุนูŠ ุจูˆุงุณุทุฉ Java). ุฃุถูู‡:

 @JvmStatic val hasPlugins @JvmName("hasPlugin") get() = plugins.isNotEmpty() 

ุฏุนูˆู†ุง ู†ุชุญู‚ู‚ ู…ู…ุง ุญุตู„ู†ุง ุนู„ูŠู‡ ููŠ Java: ู„ู… ุชุนุฏ ุทุฑูŠู‚ุฉ getHasPlugins ู…ูˆุฌูˆุฏุฉ ุŒ ูˆู„ูƒู† hasPlugins ู‡ูŠ ุดูŠุก ุจุญุฏ ุฐุงุชู‡. ู‡ุฐุง ุญู„ ู…ุดูƒู„ุชู†ุง ุŒ ู…ุฑุฉ ุฃุฎุฑู‰ ุŒ ู…ุน ุชุนู„ูŠู‚ ุชูˆุถูŠุญูŠ ูˆุงุญุฏ. ุงู„ุขู† ู†ุญู„ ุฌู…ูŠุน ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ!

ูƒู…ุง ุชุฑู‰ ุŒ ู‡ู†ุง ู†ุถุน ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ู…ุจุงุดุฑุฉ ุนู„ู‰ ุงู„ูู‡ู…. ู…ุง ุณุจุจ ุฐู„ูƒุŸ ู…ุน ุญู‚ูŠู‚ุฉ ุฃู†ู‡ ุชุญุช ุงู„ู…ู„ูƒูŠุฉ ู‡ูˆ ุงู„ูƒุซูŠุฑ ู…ู† ูƒู„ ุดูŠุก ุŒ ูˆู„ูŠุณ ู…ู† ุงู„ูˆุงุถุญ ู…ุง ูŠู†ุทุจู‚JvmName. ุฅุฐุง ู‚ู…ุช ุจู†ู‚ู„ ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ุฅู„ู‰ val hasPlugins ู†ูุณู‡ุง ุŒ ูุฅู† ุงู„ู…ุชุฑุฌู… ู„ู† ูŠูู‡ู… ู…ุง ูŠุฌุจ ุชุทุจูŠู‚ู‡ ุนู„ูŠู‡.

ูˆู…ุน ุฐู„ูƒ ุŒ ูุฅู† Kotlin ู„ุฏูŠู‡ ุฃูŠุถู‹ุง ุงู„ู‚ุฏุฑุฉ ุนู„ู‰ ุชุญุฏูŠุฏ ู…ูƒุงู† ุงุณุชุฎุฏุงู… ุงู„ุชุนู„ูŠู‚ุงุช ุงู„ุชูˆุถูŠุญูŠุฉ ู…ุจุงุดุฑุฉู‹. ูŠู…ูƒู†ูƒ ุชุญุฏูŠุฏ getter ุงู„ู‡ุฏู ุŒ ุงู„ู…ู„ู ุจุฃูƒู…ู„ู‡ ุŒ ุงู„ู…ุนู„ู…ุฉ ุŒ ุงู„ู…ููˆุถ ุŒ ุงู„ุญู‚ู„ ุŒ ุงู„ุฎุตุงุฆุต ุŒ ูˆุธุงุฆู ู…ู„ุญู‚ ุงู„ู…ุณุชู‚ุจู„ ุŒ ุงู„ู…ุนู„ู…ุฉ setter ูˆ setter. ููŠ ุญุงู„ุชู†ุง ุŒ ุงู„ุจุงู„ุบุฉ ู‡ูŠ ู…ุซูŠุฑุฉ ู„ู„ุงู‡ุชู…ุงู…. ูˆุฅุฐุง ูุนู„ุช ุฐู„ูƒ ุŒ ูุณูŠูƒูˆู† ู„ู‡ ู†ูุณ ุงู„ุชุฃุซูŠุฑ ุนู†ุฏู…ุง ู‚ู…ู†ุง ุจุชุนู„ูŠู‚ ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ ุนู„ู‰ ุงู„ุญุตูˆู„ ุนู„ู‰:

 @get:JvmName("hasPlugins") @JvmStatic val hasPlugins get() = plugins.isNotEmpty() 

ูˆูู‚ู‹ุง ู„ุฐู„ูƒ ุŒ ุฅุฐุง ู„ู… ูŠูƒู† ู„ุฏูŠูƒ ู…ูุฏุฑุจ ู…ูุฎุตุต ุŒ ููŠู…ูƒู†ูƒ ุฅุฑูุงู‚ู‡ ู…ุจุงุดุฑุฉ ุจู…ู…ุชู„ูƒุงุชูƒ ุŒ ูˆุณูŠูƒูˆู† ูƒู„ ุดูŠุก ุนู„ู‰ ู…ุง ูŠุฑุงู….

ุงู„ู†ู‚ุทุฉ ุงู„ุชุงู„ูŠุฉ ุงู„ุชูŠ ุชุฑุจูƒู†ุง ู‚ู„ูŠู„ุงู‹ ู‡ูŠ "Analytics.INSTANCE.getEMPTY_PLUGIN ()". ู„ู… ูŠุนุฏ ุงู„ุฃู…ุฑ ู‡ู†ุง ุญุชู‰ ุจุงู„ู„ุบุฉ ุงู„ุฅู†ุฌู„ูŠุฒูŠุฉ ุŒ ูˆู„ูƒู† ุจุจุณุงุทุฉ: ู„ู…ุงุฐุงุŸ ุงู„ุฌูˆุงุจ ู‡ูˆ ู†ูุณู‡ ุŒ ูˆู„ูƒู† ุฃูˆู„ุงู‹ ู…ู‚ุฏู…ุฉ ุตุบูŠุฑุฉ.

ู…ู† ุฃุฌู„ ุฌุนู„ ุงู„ุญู‚ู„ ุซุงุจุชู‹ุง ุŒ ู„ุฏูŠูƒ ุทุฑูŠู‚ุชุงู†. ุฅุฐุง ู‚ู…ุช ุจุชุนุฑูŠู ุซุงุจุช ูƒู†ูˆุน ุจุฏุงุฆูŠ ุฃูˆ ูƒุณู„ุณู„ุฉ ุŒ ูˆุฏุงุฎู„ ุงู„ูƒุงุฆู† ุฃูŠุถู‹ุง ุŒ ููŠู…ูƒู†ูƒ ุงุณุชุฎุฏุงู… ุงู„ูƒู„ู…ุฉ ุงู„ุฃุณุงุณูŠุฉ const ุŒ ุซู… ู„ู† ูŠุชู… ุฅู†ุดุงุก ุนูˆุงู…ู„ ุถุจุท getter ูˆุฃุดูŠุงุก ุฃุฎุฑู‰. ุณูŠูƒูˆู† ุซุงุจุชู‹ุง ุนุงุฏูŠู‹ุง - ุซุงุจุชู‹ุง ู†ู‡ุงุฆูŠู‹ุง ุฎุงุตู‹ุง - ูˆุณูŠุชู… ุชุญุฏูŠุฏู‡ ุŒ ุฃูŠ ุดูŠุก ุฌุงูุง ุนุงุฏูŠ ุชู…ุงู…ู‹ุง.

ูˆู„ูƒู† ุฅุฐุง ูƒู†ุช ุชุฑูŠุฏ ุนู…ู„ ุซุงุจุช ู…ู† ูƒุงุฆู† ู…ุฎุชู„ู ุนู† ุงู„ุณู„ุณู„ุฉ ุŒ ูู„ู† ุชุชู…ูƒู† ู…ู† ุงุณุชุฎุฏุงู… ูƒู„ู…ุฉ const ู„ู‡ุฐุง ุงู„ุบุฑุถ. ู‡ู†ุง ู„ุฏูŠู†ุง ูุงู„ EMPTY_PLUGIN = EmptyPlugin () ุŒ ูˆูู‚ู‹ุง ู„ู‡ุง ุŒ ู…ู† ุงู„ูˆุงุถุญ ุฃู† ู‡ุฐุง ุงู„ู…ูˆู„ุน ุงู„ุฑู‡ูŠุจ ู‚ุฏ ุชู… ุฅู†ุดุงุคู‡. ูŠู…ูƒู†ู†ุง ุฅุนุงุฏุฉ ุชุณู…ูŠุฉJvmName ู…ุน ุชุนู„ูŠู‚ ุชูˆุถูŠุญูŠ ุŒ ูˆุฅุฒุงู„ุฉ ู‡ุฐู‡ ุงู„ุจุงุฏุฆุฉ ุŒ ูˆู„ูƒู† ู„ุง ุชุฒุงู„ ุทุฑูŠู‚ุฉ - ู…ุน ุฃู‚ูˆุงุณ. ู„ุฐุง ุŒ ู„ู† ุชุนู…ู„ ุงู„ุญู„ูˆู„ ุงู„ู‚ุฏูŠู…ุฉ ุŒ ู†ุญู† ู†ุจุญุซ ุนู† ุญู„ูˆู„ ุฌุฏูŠุฏุฉ.

ูˆู‡ู†ุง ู„ู‡ุฐุง ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ @ JvmField ุŒ ุงู„ุฐูŠ ูŠู‚ูˆู„: "ุฃู†ุง ู„ุง ุฃุฑูŠุฏ ุฑุณุงุฆู„ ู‡ู†ุง ุŒ ูˆู„ุง ุฃุฑูŠุฏ ู…ุณุชูˆุทู†ูŠู† ุŒ ุงุฌุนู„ูˆู†ูŠ ุญู‚ู„ุงู‹." ุถุนู‡ ุฃู…ุงู… ูุงู„ EMPTY_PLUGIN ูˆุชุญู‚ู‚ ู…ู† ุตุญุฉ ูƒู„ ุดูŠุก.



ูŠุนุฑุถ ุนุงุฑุถ Kotlin Bytecode ุงู„ู‚ุทุนุฉ ุงู„ู…ู…ูŠุฒุฉ ุงู„ุชูŠ ุชู‚ู ุนู„ูŠู‡ุง ุญุงู„ูŠู‹ุง ููŠ ุงู„ู…ู„ู. ู†ุญู† ุงู„ุขู† ู†ู‚ู ุนู„ู‰ EMPTY_PLUGIN ุŒ ูˆุชุฑู‰ ู‡ู†ุง ุฃู†ู‡ ุชุชู… ูƒุชุงุจุฉ ู†ูˆุน ู…ู† ุงู„ุชู‡ูŠุฆุฉ ููŠ ุงู„ู…ู†ุดุฆ. ูˆุงู„ุญู‚ูŠู‚ุฉ ู‡ูŠ ุฃู† ุงู„ุจุงู„ุบุฉ ู„ู… ุชุนุฏ ู…ูˆุฌูˆุฏุฉ ูˆุงู„ูˆุตูˆู„ ุฅู„ูŠู‡ุง ู„ู„ุชุณุฌูŠู„ ูู‚ุท. ูˆุฅุฐุง ู†ู‚ุฑุช ุนู„ู‰ ููƒ ุงู„ุชุญูˆูŠู„ ุŒ ูุณู†ุฑู‰ ุธู‡ูˆุฑ "EmptyPlugin EMPTY_PLUGIN" ุงู„ู†ู‡ุงุฆูŠ ุงู„ุซุงุจุช ุงู„ุนุงู… ุŒ ูˆู‡ุฐุง ุจุงู„ุถุจุท ู…ุง ุญู‚ู‚ู†ุงู‡. ุฌู…ูŠู„ ู†ุชุญู‚ู‚ ู…ู† ุฃู† ูƒู„ ุดูŠุก ูŠุฑุถูŠ ุงู„ุฌู…ูŠุน ุŒ ูˆู„ุง ุณูŠู…ุง ุงู„ู…ุชุฑุฌู…. ุฃู‡ู… ุดูŠุก ุชุญุชุงุฌ ุฅู„ู‰ ุงุณุชุฑุถุงุฆู‡ ู‡ูˆ ุงู„ู…ุชุฑุฌู….

ุงู„ูˆุฑุงุซุฉ


ู„ู†ุฃุฎุฐ ุงุณุชุฑุงุญุฉ ู…ู† ุงู„ูƒูˆุฏ ูˆู†ู„ู‚ูŠ ู†ุธุฑุฉ ุนู„ู‰ ุงู„ุฃุฏูˆูŠุฉ ุงู„ุฌู†ูŠุณุฉ. ู‡ุฐุง ู…ูˆุถูˆุน ุณุงุฎู† ุฌุฏุง. ุฃูˆ ุฒู„ู‚ ุŒ ุงู„ุฐูŠ ู„ู… ูŠุนุฏ ูŠุญุจ ุฐู„ูƒ. ุฌุงูุง ู„ู‡ุง ุชุนู‚ูŠุฏุงุชู‡ุง ุงู„ุฎุงุตุฉ ุŒ ู„ูƒู† Kotlin ู…ุฎุชู„ูุฉ. ุจุงุฏุฆ ุฐูŠ ุจุฏุก ุŒ ู†ุญู† ู‚ู„ู‚ูˆู† ุจุดุฃู† ุงู„ุงุฎุชู„ุงู. ู…ุง ู‡ุฐุง

ุงู„ุชุจุงูŠู† ู‡ูˆ ุทุฑูŠู‚ุฉ ู„ู†ู‚ู„ ุงู„ู…ุนู„ูˆู…ุงุช ุญูˆู„ ู‡ุฑู…ูŠุฉ ุงู„ู†ูˆุน ู…ู† ุงู„ุฃู†ูˆุงุน ุงู„ุฃุณุงุณูŠุฉ ุฅู„ู‰ ุงู„ู…ุดุชู‚ุงุช ุŒ ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ุฅู„ู‰ ุงู„ุญุงูˆูŠุงุช ุฃูˆ ุฅู„ู‰ ุงู„ุฃุฏูˆูŠุฉ ุงู„ุฌู†ูŠุณุฉ. ู‡ู†ุง ู„ุฏูŠู†ุง ูุฆุชูŠ ุงู„ุญูŠูˆุงู†ุงุช ูˆุงู„ูƒู„ุจ ู…ุน ุงุชุตุงู„ ูˆุงุถุญ ู„ู„ุบุงูŠุฉ: ุงู„ูƒู„ุจ ู‡ูˆ ู†ูˆุน ูุฑุนูŠ ุŒ ูˆุงู„ุญูŠูˆุงู† ู‡ูˆ ู†ูˆุน ูุฑุนูŠ ุŒ ูˆุงู„ุณู‡ู… ูŠุฃุชูŠ ู…ู† ุงู„ู†ูˆุน ุงู„ูุฑุนูŠ.



ูˆู…ุง ุงู„ุนู„ุงู‚ุฉ ุงู„ุชูŠ ุณุชูƒูˆู† ู„ู‡ุง ู…ุดุชู‚ุงุชู‡ุงุŸ ุฏุนูˆู†ุง ู†ู„ู‚ูŠ ู†ุธุฑุฉ ุนู„ู‰ ุจุนุถ ุงู„ุญุงู„ุงุช.

ุงู„ุฃูˆู„ ู‡ูˆ ุงู„ู…ูƒุฑุฑ. ู„ุชุญุฏูŠุฏ ู…ุง ู‡ูˆ ู†ูˆุน ูุฑุนูŠ ูˆู…ุง ู‡ูˆ ู†ูˆุน ูุฑุนูŠ ุŒ ุณู†ุณุชุฑุดุฏ ุจู‚ุงุนุฏุฉ ุงู„ุงุณุชุจุฏุงู„ Barbara Liskov. ูŠู…ูƒู† ุตูŠุงุบุชู‡ ุนู„ู‰ ุงู„ู†ุญูˆ ุงู„ุชุงู„ูŠ: "ู„ุง ูŠุฌุจ ุฃู† ูŠุชุทู„ุจ ุงู„ู†ูˆุน ุงู„ูุฑุนูŠ ุฃูƒุซุฑ ู…ู† ุฐู„ูƒ ุŒ ูˆู„ุง ูŠู‚ุฏู… ุฃู‚ู„ ู…ู† ุฐู„ูƒ."

ููŠ ุญุงู„ุชู†ุง ุŒ ุงู„ุดูŠุก ุงู„ูˆุญูŠุฏ ุงู„ุฐูŠ ูŠูุนู„ู‡ Iterator ู‡ูˆ ุฅุนุทุงุฆู†ุง ุฃุดูŠุงุก ู…ูƒุชูˆุจุฉ ุŒ ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ Animal. ุฅุฐุง ู‚ุจู„ู†ุง Iterator ููŠ ู…ูƒุงู† ู…ุง ุŒ ููŠู…ูƒู†ู†ุง ูˆุถุน Iterator ู‡ู†ุงูƒ ุŒ ูˆุงู„ุญุตูˆู„ ุนู„ู‰ Animal ู…ู† ุงู„ุทุฑูŠู‚ุฉ ุงู„ุชุงู„ูŠุฉ () ุŒ ู„ุฃู† ุงู„ูƒู„ุจ ู‡ูˆ ุฃูŠุถู‹ุง Animal. ู†ุญู† ู†ู‚ุฏู… ู„ูŠุณ ุฃู‚ู„ ุŒ ูˆู„ูƒู† ุฃูƒุซุฑ ุŒ ู„ุฃู† ุงู„ูƒู„ุจ ู‡ูˆ ู†ูˆุน ูุฑุนูŠ.



ุฃูƒุฑุฑ: ู†ุญู† ู†ู‚ุฑุฃ ูู‚ุท ู…ู† ู‡ุฐุง ุงู„ู†ูˆุน ุŒ ู„ุฐู„ูƒ ูŠุชู… ุงู„ุญูุงุธ ุนู„ู‰ ุงู„ุนู„ุงู‚ุฉ ุจูŠู† ุงู„ู†ูˆุน ูˆุงู„ู†ูˆุน ุงู„ูุฑุนูŠ ู‡ู†ุง. ูˆุชุณู…ู‰ ู‡ุฐู‡ ุงู„ุฃู†ูˆุงุน ุงู„ู…ุชุบูŠุฑ ุงู„ู…ุดุชุฑูƒ.

ุญุงู„ุฉ ุฃุฎุฑู‰: ุงู„ุนู…ู„. ุงู„ุนู…ู„ ู‡ูˆ ูˆุธูŠูุฉ ู„ุง ุชุฑุฌุน ุดูŠุฆู‹ุง ุŒ ูˆู„ุง ุชุฃุฎุฐ ู…ุนู„ู…ุฉ ูˆุงุญุฏุฉ ุŒ ูˆู†ูƒุชุจ ูู‚ุท ุฅู„ู‰ Action ุŒ ุฃูŠ ุฃู†ู‡ุง ุชุฃุฎุฐ ูƒู„ุจู‹ุง ุฃูˆ ุญูŠูˆุงู†ู‹ุง ู…ู†ุง.



ูˆู‡ูƒุฐุง ุŒ ู„ู… ู†ุนุฏ ู‡ู†ุง ู†ู‚ุฏู… ุŒ ูˆู„ูƒู† ุงู„ุทู„ุจ ุŒ ูˆูŠุฌุจ ุฃู„ุง ู†ุทู„ุจ ุงู„ู…ุฒูŠุฏ. ู‡ุฐุง ูŠุนู†ูŠ ุฃู† ุงุนุชู…ุงุฏู†ุง ูŠุชุบูŠุฑ. "ู„ุง ุฃูƒุซุฑ" ู„ุฏูŠู†ุง ุญูŠูˆุงู† (ุญูŠูˆุงู† ุฃู‚ู„ ู…ู† ูƒู„ุจ). ูˆุชุณู…ู‰ ู‡ุฐู‡ ุงู„ุฃู†ูˆุงุน ุงู„ู…ุชู†ุงู‚ุถุฉ.

ู‡ู†ุงูƒ ุญุงู„ุฉ ุซุงู„ุซุฉ - ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„ ุŒ ArrayList ุŒ ุงู„ุชูŠ ู†ู‚ุฑุฃ ูˆู†ูƒุชุจ ู…ู†ู‡ุง. ู„ุฐู„ูƒ ุŒ ููŠ ู‡ุฐู‡ ุงู„ุญุงู„ุฉ ุŒ ู†ู†ุชู‡ูƒ ุฅุญุฏู‰ ุงู„ู‚ูˆุงุนุฏ ุŒ ู†ุทู„ุจ ุงู„ู…ุฒูŠุฏ ู„ู„ุชุณุฌูŠู„ (ูƒู„ุจ ุŒ ูˆู„ูŠุณ ุญูŠูˆุงู†). ู„ุง ุชุฑุชุจุท ู‡ุฐู‡ ุงู„ุฃู†ูˆุงุน ุจุฃูŠ ุดูƒู„ ู…ู† ุงู„ุฃุดูƒุงู„ ุŒ ูˆูŠุทู„ู‚ ุนู„ูŠู‡ุง ุซุงุจุชุฉ.



ู„ุฐู„ูƒ ุŒ ููŠ Java ุŒ ุนู†ุฏู…ุง ุชู… ุชุตู…ูŠู…ู‡ ู‚ุจู„ ุงู„ุฅุตุฏุงุฑ 1.5 (ุญูŠุซ ุธู‡ุฑุช ุงู„ุฃุฏูˆูŠุฉ ุงู„ุจุฏูŠู„ุฉ) ุŒ ู‚ุงู…ูˆุง ุงูุชุฑุงุถูŠู‹ุง ุจุนู…ู„ ู…ุตููˆูุงุช ู…ุดุชุฑูƒุฉ. ู‡ุฐุง ูŠุนู†ูŠ ุฃู†ู‡ ูŠู…ูƒู†ูƒ ุชุนูŠูŠู† ู…ุตููˆูุฉ ู…ู† ุงู„ุณู„ุงุณู„ ุฅู„ู‰ ู…ุตููˆูุฉ ุงู„ูƒุงุฆู†ุงุช ุŒ ุซู… ุชู…ุฑูŠุฑู‡ุง ููŠ ู…ูƒุงู† ู…ุง ุฅู„ู‰ ุงู„ุทุฑูŠู‚ุฉ ุงู„ุชูŠ ุชุชุทู„ุจ ุตููŠู ุงู„ูƒุงุฆู†ุงุช ุŒ ูˆู…ุญุงูˆู„ุฉ ุฏูุน ุงู„ูƒุงุฆู† ู‡ู†ุงูƒ ุŒ ุนู„ู‰ ุงู„ุฑุบู… ู…ู† ุฃู† ู‡ุฐู‡ ู…ุตููˆูุฉ ู…ู† ุงู„ุณู„ุงุณู„. ูƒู„ ุดูŠุก ุณูˆู ูŠู‚ุน ุนู„ูŠูƒ.

ุจุนุฏ ุฃู† ุชุนู„ู…ูˆุง ู…ู† ุงู„ุชุฌุฑุจุฉ ุงู„ู…ุฑูŠุฑุฉ ุฃู†ู‡ ู„ุง ูŠู…ูƒู† ุงู„ู‚ูŠุงู… ุจุฐู„ูƒ ุŒ ุนู†ุฏ ุชุตู…ูŠู… ุงู„ุฃุฏูˆูŠุฉ ุงู„ุฌู†ูŠุณุฉ ุŒ ู‚ุฑุฑูˆุง "ุณู†ุฌุนู„ ุงู„ู…ุฌู…ูˆุนุงุช ุซุงุจุชุฉ ุŒ ูˆู„ู† ู†ูุนู„ ุฃูŠ ุดูŠุก ู…ุนู‡ู…".

ูˆููŠ ุงู„ู†ู‡ุงูŠุฉ ุงุชุถุญ ุฃู†ู‡ ููŠ ู…ุซู„ ู‡ุฐุง ุงู„ุดูŠุก ุงู„ูˆุงุถุญ ุนู„ู‰ ู…ุง ูŠุจุฏูˆ ูŠุฌุจ ุฃู† ูŠูƒูˆู† ูƒู„ ุดูŠุก ุนู„ู‰ ู…ุง ูŠุฑุงู… ุŒ ูˆู„ูƒู† ููŠ ุงู„ูˆุงู‚ุน ู„ูŠุณ ุนู„ู‰ ู…ุง ูŠุฑุงู…:

 // Java List<Dog> dogs = new ArrayList<>(); List<Animal> animals = dogs; 

ู„ูƒู†ู†ุง ุจุญุงุฌุฉ ุฅู„ู‰ ุชุญุฏูŠุฏ ู…ุง ูŠู…ูƒู†ู†ุง ุŒ ุจุทุฑูŠู‚ุฉ ู…ุง ุŒ ู…ุง ูŠู…ูƒู†ู†ุง ูุนู„ู‡: ุฅุฐุง ูƒู†ุง ู†ู‚ุฑุฃ ูู‚ุท ู…ู† ู‡ุฐู‡ ุงู„ูˆุฑู‚ุฉ ุŒ ูู„ู…ุงุฐุง ู„ุง ู†ุชู…ูƒู† ู…ู† ู†ู‚ู„ ู‚ุงุฆู…ุฉ ุงู„ูƒู„ุงุจ ู‡ู†ุงุŸ ู„ุฐู„ูƒ ุŒ ู…ู† ุงู„ู…ู…ูƒู† ุฃู† ูŠู…ูŠุฒ ุจุงุณุชุฎุฏุงู… ุญุฑู ุงู„ุจุฏู„ ู†ูˆุน ุงู„ุงุฎุชู„ุงู ุงู„ุฐูŠ ุณูŠุญุชูˆูŠ ุนู„ูŠู‡ ู‡ุฐุง ุงู„ู†ูˆุน:

 List<Dog> dogs = new ArrayList<>(); List<? extends Animal> animals = dogs; 

ูƒู…ุง ุชุฑู‰ ุŒ ูŠุดุงุฑ ุฅู„ู‰ ู‡ุฐุง ุงู„ุงุฎุชู„ุงู ููŠ ู…ูƒุงู† ุงู„ุงุณุชุฎุฏุงู… ุŒ ุญูŠุซ ู†ุนูŠู† ุงู„ูƒู„ุงุจ. ู„ุฐู„ูƒ ุŒ ูŠุณู…ู‰ ู‡ุฐุง ุงุฎุชู„ุงู ู…ูˆู‚ุน ุงู„ุงุณุชุฎุฏุงู….

ู…ุง ู‡ูŠ ุณู„ุจูŠุงุช ู‡ุฐุงุŸ ุงู„ุฌุงู†ุจ ุงู„ุณู„ุจูŠ ู‡ูˆ ุฃู†ู‡ ูŠุฌุจ ุนู„ูŠูƒ ุชุญุฏูŠุฏ ุญุฑู ุงู„ุจุฏู„ ุงู„ู…ุฎูŠู ู‡ุฐุง ุฃูŠู†ู…ุง ุชุณุชุฎุฏู… API ุงู„ุฎุงุต ุจูƒ ุŒ ูˆูƒู„ ู‡ุฐุง ู…ุซู…ุฑ ู„ู„ุบุงูŠุฉ ููŠ ุงู„ุชุนู„ูŠู…ุงุช ุงู„ุจุฑู…ุฌูŠุฉ. ูˆู„ูƒู† ููŠ Kotlin ู„ุณุจุจ ู…ุง ุŒ ูŠุนู…ู„ ู…ุซู„ ู‡ุฐุง ุงู„ุดูŠุก ุฎุงุฑุฌ ุงู„ุตู†ุฏูˆู‚ ุŒ ูˆู„ุง ุชุญุชุงุฌ ุฅู„ู‰ ุชุญุฏูŠุฏ ุฃูŠ ุดูŠุก:

 val dogs: List<Dog> = ArrayList() val animals: List<Animal> = dogs 

ู…ุง ุณุจุจ ุฐู„ูƒุŸ ู…ุน ุญู‚ูŠู‚ุฉ ุฃู† ุงู„ุฃูˆุฑุงู‚ ู…ุฎุชู„ูุฉ ููŠ ุงู„ูˆุงู‚ุน. ุชุนู†ูŠ ุงู„ู‚ุงุฆู…ุฉ ููŠ Java ุงู„ูƒุชุงุจุฉ ุŒ ุจูŠู†ู…ุง ููŠ Kotlin ุชูƒูˆู† ู„ู„ู‚ุฑุงุกุฉ ูู‚ุท ุŒ ูˆู„ูŠุณ ุถู…ู†ูŠู‹ุง. ู„ุฐู„ูƒ ุŒ ู…ู† ุญูŠุซ ุงู„ู…ุจุฏุฃ ุŒ ูŠู…ูƒู†ู†ุง ุฃู† ู†ู‚ูˆู„ ุนู„ู‰ ุงู„ููˆุฑ ุฃู†ู†ุง ู†ู‚ุฑุฃ ูู‚ุท ู…ู† ู‡ู†ุง ุŒ ูˆุจุงู„ุชุงู„ูŠ ูŠู…ูƒู†ู†ุง ุฃู† ู†ูƒูˆู† ู…ุชุบูŠุฑูŠู†. ูˆูŠุชู… ุชุนูŠูŠู† ู‡ุฐุง ุจุงู„ุถุจุท ููŠ ุชุนุฑูŠู ุงู„ู†ูˆุน ุจุงู„ูƒู„ู…ุฉ ุงู„ุฃุณุงุณูŠุฉ ู„ู„ุฎุงุฑุฌ ุงู„ุชูŠ ุชุญู„ ู…ุญู„ ุญุฑู ุงู„ุจุฏู„:

 interface List<out E> : Collection<E> 

ูˆู‡ุฐุง ู…ุง ูŠุณู…ู‰ ุงุฎุชู„ุงู ู…ูˆู‚ุน ุงู„ุฅุนู„ุงู†. ูˆู‡ูƒุฐุง ุŒ ุฃุดุฑู†ุง ุฅู„ู‰ ูƒู„ ุดูŠุก ููŠ ู…ูƒุงู† ูˆุงุญุฏ ุŒ ูˆุญูŠุซ ู†ุณุชุฎุฏู…ู‡ ุŒ ู„ู… ู†ุนุฏ ู†ุชู†ุงูˆู„ ู‡ุฐุง ุงู„ู…ูˆุถูˆุน. ูˆู‡ุฐุง nishtyak.

ุนูˆุฏุฉ ุงู„ู‰ ุงู„ูƒูˆุฏ


ุฏุนูˆู†ุง ู†ุนูˆุฏ ุฅู„ู‰ ุฃุนู…ุงู‚ู†ุง. ู‡ู†ุง ู„ุฏูŠู†ุง ุทุฑูŠู‚ุฉ 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()); 

ู†ุธุฑู‹ุง ู„ุญู‚ูŠู‚ุฉ ุฃู† ุงู„ู‚ุงุฆู…ุฉ ููŠ Kotlin ู‡ูŠ ู…ุชุบูŠุฑ ู…ุดุชุฑูƒ ุŒ ูŠู…ูƒู†ู†ุง ุจุณู‡ูˆู„ุฉ ุชู…ุฑูŠุฑ ู‚ุงุฆู…ุฉ ูˆุฑุซุฉ ุงู„ุจุฑู†ุงู…ุฌ ุงู„ู…ุณุงุนุฏ ู‡ู†ุง. ูƒู„ ุดูŠุก ุณูŠุนู…ู„ ุŒ ุงู„ู…ุชุฑุฌู… ู„ุง ูŠู…ุงู†ุน. ูˆู„ูƒู† ู†ุธุฑู‹ุง ู„ุญู‚ูŠู‚ุฉ ูˆุฌูˆุฏ ุงุฎุชู„ุงู ููŠ ู…ูˆู‚ุน ุงู„ุฅุนู„ุงู† ุญูŠุซ ุญุฏุฏู†ุง ูƒู„ ุดูŠุก ุŒ ูู„ุง ูŠู…ูƒู†ู†ุง ุจุนุฏ ุฐู„ูƒ ุงู„ุชุญูƒู… ููŠ ุงู„ุงุชุตุงู„ ุจู€ Java ููŠ ู…ุฑุญู„ุฉ ุงู„ุงุณุชุฎุฏุงู…. ูˆู„ูƒู† ู…ุงุฐุง ูŠุญุฏุซ ุฅุฐุง ุฃุฑุฏู†ุง ุญู‚ู‹ุง ูˆุฌูˆุฏ ูˆุฑู‚ุฉ ุฅุถุงููŠุฉ ุŒ ูู„ุง ู†ุฑูŠุฏ ุฃูŠ ูˆุฑุซุฉ ู‡ู†ุงูƒุŸ ู„ุง ุชูˆุฌุฏ ู…ุญุฏุฏุงุช ู„ู‡ุฐุง ุŒ ูˆู„ูƒู† ู…ุงุฐุงุŸ ู‡ุฐุง ุตุญูŠุญ ุŒ ู‡ู†ุงูƒ ุชุนู„ูŠู‚ ุชูˆุถูŠุญูŠ. ูˆูŠุทู„ู‚ ุนู„ู‰ ุงู„ุชุนู„ูŠู‚ ุงู„ุชูˆุถูŠุญูŠ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() /** @throws IOException if sending failed */ 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 if sending failed */ @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 , . โ€” , .

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


All Articles