Ċ import Ġlink . kotlin . scripts . dsl . Article Ċ import Ġlink . kotlin . scripts . dsl . Link Type .* Ċ import Ġlink . kotlin . scripts . dsl . Language Codes .* Ċ import Ġjava . time . LocalDate Ċ Ċ // Ġlanguage = Markdown Ċ val Ġbody Ġ= Ġ""" Ċ ![]( https :// d 2 6 2 il b 5 1 hl tx 0 . cloudfront . net / max / 2 0 0 0 / 1 * q P ZU pt A is Hb 0 s 0 T SL r Bv HA . jpeg ) Ċ * Photo ĠBy Ġ[ J oh hy ĠSilver cloud ]( https :// www . flickr . com / photos / jo h nn ys il ver cloud /) Ġ/ Ġ[ CC - BY - SA ]( https :// creativecommons . org / licenses / by - sa / 2 . 0 /) * Ċ Ċ ### ĠKotlin : ĠThe ĠGood , ĠThe ĠBad , Ġand ĠThe ĠU gly Ċ Ċ In Ġmy Ġ[ last Ġarticle ]( https :// medium . com / keep safe - engineering / lessons - from - con verting - an - app - to - 1 0 0 - kotlin - 6 8 9 8 4 a 0 5 dcb 6 ), ĠI Ġtalk ed Ġabout Ġconverting ĠJava Ġcode bases Ġto ĠKotlin , Ġand Ġabout Ġsome Ġof Ġthe Ġlibraries ĠI Ġlike . ĠHere , ĠI âĢĻ m Ġgoing Ġto Ġtalk Ġabout Ġmy Ġthoughts Ġon Ġthe ĠKotlin Ġlanguage Ġitself Ġand Ġthe Ġway Ġit Ġinteract s Ġwith ĠJava . Ċ Ċ ### ĠThe ĠGood Ċ Ċ There âĢĻ s Ġa Ġlot Ġto Ġlike Ġabout ĠKotlin . ĠSome Ġof Ġthe Ġobvious Ġfeatures Ġlike Ġnull Ġsafety , Ġproperty Ġaccess , Ġand Ġunchecked Ġexceptions Ġare Ġcovered Ġat Ġlength Ġin Ġother Ġ[ publications ]( https :// blog . jetbrains . com / kotlin / 2 0 1 6 / 0 1 / kotlin - digest - 2 0 1 5 /), Ġso ĠI Ġwon âĢĻ t Ġrepeat Ġthem Ġhere . ĠInstead , Ġhere Ġare Ġsome Ġof Ġthe Ġless Ġcommonly Ġdiscussed Ġfeatures Ġof ĠKotlin Ġthat ĠI Ġreally Ġlike . Ċ Ċ #### ĠAutomatic Ġconversion Ġof ĠJava Ġto ĠKotlin Ċ Ċ Jet Brains âĢĻ ĠJava Ġto ĠKotlin Ġconverter Ġintegrated Ġinto ĠIntelliJ Ġsaves Ġa Ġhuge Ġamount Ġof Ġtime . ĠIt âĢĻ s Ġfar Ġfrom Ġperfect , Ġbut Ġit Ġsaves Ġyou Ġfrom Ġhaving Ġto Ġre type Ġm und ane Ġcode . ĠWithout Ġit , Ġmigr ating Ġcode Ġfrom ĠJava Ġto ĠKotlin Ġwould Ġtake Ġsignificantly Ġlonger . Ċ Ċ #### Ġlateinit , ĠDeleg ates . notNull Ġand Ġlazy Ċ Ċ Kotlin âĢĻ s Ġnull Ġsafety Ġis Ġgreat , Ġbut Ġdue Ġto Ġthe Ġway Ġthe ĠAndroid ĠActivity Ġlifecycle Ġis Ġdesigned , Ġyou âĢĻ ll Ġoften Ġfind Ġthat Ġyou Ġhave Ġto Ġinitialize Ġa Ġproperty Ġin Ġa Ġcallback Ġlike Ġ_ onCreate _ Ġinstead Ġof Ġyour Ġclass âĢĻ s Ġconstructor . ĠLet âĢĻ s Ġsay Ġyou Ġhave Ġa Ġproperty Ġthat Ġyou Ġwould Ġlike Ġto Ġdefine Ġlike : Ċ Ċ ``` kotlin Ċ val Ġname : ĠString Ċ ``` Ċ Ċ If Ġyou Ġhave Ġto Ġinitialize Ġthat Ġproperty Ġin ĠonCreate , Ġit Ġcannot Ġbe Ġa Ġ_ val _: Ġit Ġhas Ġto Ġbe Ġmutable Ġvar . ĠBut Ġit Ġstill Ġneeds Ġto Ġbe Ġgiven Ġa Ġvalue Ġat Ġinitialization Ġtime , Ġso Ġthe Ġobvious Ġway Ġto Ġdefine Ġit Ġwould Ġbe Ġas Ġa Ġnullable Ġproperty : Ċ Ċ ``` kotlin Ċ var Ġname : ĠString ? Ġ= Ġnull Ċ ``` Ċ Ċ That Ġworks , Ġbut Ġthen Ġyou Ġhave Ġto Ġdo Ġnull Ġchecks Ġeverywhere Ġyou Ġaccess Ġthat Ġproperty . ĠEven Ġthough ĠKotlin Ġhas Ġrelatively Ġpain less Ġnull Ġassertions , Ġyou âĢĻ d Ġrather Ġnot Ġhave Ġto Ġtype Ġ_ !! _ Ġeverywhere Ġif Ġyou Ġknow Ġthat Ġthe Ġproperty Ġisn âĢĻ t Ġgoing Ġto Ġbe Ġnull Ġin Ġpractice . ĠFort un ately , ĠKotlin Ġhas Ġbetter Ġways : Ġ[_ late init _ ]( https :// kotlin lang . org / docs / reference / properties . html # late - initialized - properties ) Ġand Ġ[_ Deleg ates . notNull _ ]( https :// kotlin lang . org / api / latest / jvm / stdlib / kotlin . properties /- deleg ates / not - null . html ). ĠWith Ġeither Ġof Ġthose , Ġyou Ġcan Ġdefine Ġyour Ġproperty Ġas Ġa Ġnon - null Ġtype Ġwithout Ġan Ġinitializer : Ċ Ċ ``` kotlin Ċ late init Ġvar Ġname : ĠString ĠĠ Ċ var Ġage : ĠInt Ġby ĠDeleg ates . notNull < String >() Ċ ``` Ċ Ċ In Ġeither Ġcase , Ġif Ġyou Ġattempt Ġto Ġaccess Ġthe Ġproperty Ġbefore Ġit âĢĻ s Ġinitialized , Ġan Ġexception Ġwill Ġbe Ġthrown Ġ_[ 1 ] _. Ġ_ late init _ Ġcan âĢĻ t Ġbe Ġused Ġon Ġproperties Ġof Ġprimitive Ġtypes , Ġbut Ġotherwise Ġthe Ġtwo Ġmethods Ġare Ġmostly Ġthe Ġsame Ġ_[ 2 ] _. Ċ Ċ A Ġthird Ġoption Ġthat Ġcan Ġbe Ġuseful Ġis Ġthe Ġ_ lazy _ Ġdelegate . ĠIf Ġyour Ġproperty Ġcan Ġbe Ġinitialized Ġwith Ġdata Ġfrom Ġonly Ġother Ġproperties Ġor Ġmethods , Ġthen Ġthis Ġmight Ġbe Ġa Ġgood Ġfit . ĠYou Ġcan Ġuse Ġit Ġlike Ġso : Ċ Ċ ``` kotlin Ċ val Ġimm : ĠInput Method Manager Ġby Ġlazy Ġ{ ĠĠĠĊĠĠĠ Ġget System Service ( INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĠĠĠ Ċ } Ċ ``` Ċ Ċ The Ġblock Ġpassed Ġto Ġ_ lazy _ Ġisn âĢĻ t Ġcalled Ġuntil Ġthe Ġfirst Ġtime Ġthe Ġproperty Ġis Ġread , Ġand Ġthe Ġreturn Ġvalue Ġof Ġthe Ġblock Ġis Ġsaved Ġfor Ġfuture Ġaccesses , Ġso Ġthe Ġblock Ġwill Ġonly Ġbe Ġcalled Ġonce . Ċ Ċ #### ĠFunctional Ġcollection Ġextensions Ċ Ċ Kotlin Ġhas Ġsome Ġgreat Ġfunctional Ġ[ extensions Ġmethods Ġon Ġcollections Ġand Ġiter ables ]( https :// kotlin lang . org / api / latest / jvm / stdlib / kotlin . collections / index . html # functions ). ĠFunctions Ġlike Ġ[_ any _ ]( https :// kotlin lang . org / api / latest / jvm / stdlib / kotlin . collections / any . html ), Ġ[_ join ToString _ ]( https :// kotlin lang . org / api / latest / jvm / stdlib / kotlin . collections / join - to - string . html ), Ġand Ġ[_ associate _ ]( https :// kotlin lang . org / api / latest / jvm / stdlib / kotlin . collections / associate . html ) Ġcan Ġsave Ġyou Ġfrom Ġa Ġlot Ġof Ġhand - coded Ġ_ for _ Ġloops Ġthat Ġare Ġnecessary Ġin ĠJava . Ċ Ċ There Ġis Ġalso Ġa Ġlazy Ġversion Ġof Ġmany Ġof Ġthe Ġfunctional Ġcollections Ġoperations Ġthat Ġwon âĢĻ t Ġmake Ġa Ġcopy Ġof Ġyour Ġcollection Ġafter Ġeach Ġoperation , Ġbut Ġmy Ġbenchmarks Ġfind Ġthat Ġthe Ġlazy Ġand Ġeager Ġversions Ġof Ġoperators Ġhave Ġa Ġsimilar Ġenough Ġperformance Ġthat Ġit Ġusually Ġwon âĢĻ t Ġmatter Ġwhich Ġone Ġyou Ġuse Ġ_[ 3 ] _. Ċ Ċ #### ĠNamed Ġand Ġdefault Ġfunction Ġarguments Ċ Ċ [ Named Ġparameters ]( https :// kotlin lang . org / docs / reference / functions . html # named - arguments ) Ġand Ġ[ Default Ġparameters ]( https :// kotlin lang . org / docs / reference / functions . html # named - arguments ) Ġare Ġpretty Ġbasic , Ġbut Ġthey Ġlet Ġyou Ġcut Ġdown Ġon Ġa Ġlot Ġof Ġboilerplate Ġof Ġdefining Ġover loads , Ġand Ġreplace Ġone Ġof Ġthe Ġmain Ġuse Ġcases Ġof Ġthe ĠBuilder Ġpattern . Ċ Ċ Depend ing Ġon Ġyour Ġuse Ġcase , Ġyou Ġcould Ġpotentially Ġeven Ġuse Ġdefault Ġarguments Ġfor Ġbasic Ġdependency Ġinjection Ġby Ġmaking Ġa Ġproduction Ġdependency Ġthe Ġdefault , Ġand Ġpassing Ġa Ġmock Ġduring Ġtests . Ċ Ċ For Ġexample , Ġif Ġyou Ġhave Ġa Ġpresenter Ġthat Ġneeds Ġsome Ġglobal Ġstate , Ġyou Ġcould Ġdefine Ġits Ġconstructor Ġlike Ġthis : Ċ Ċ ``` kotlin Ċ class ĠPres enter ( ĠĠĊĠĠĠĠĠĠĠ Ġval Ġokhttp : ĠOk Http Ġ= Ġproduction Ok Http (), ĠĠĊĠĠĠĠĠĠĠ Ġval Ġpic asso : ĠPic asso Ġ= Ġproduction Pic asso Instance () ĠĠ Ċ ) Ġ{... } Ċ ``` Ċ Ċ That Ġallows Ġyou Ġto Ġcreate Ġthe Ġpresenter Ġwithout Ġarguments Ġfrom Ġyour ĠUI Ġcode , Ġwhile Ġallowing Ġyou Ġto Ġpass Ġmock Ġinstances Ġof Ġthe Ġdependencies Ġduring Ġtests . ĠFull ĠDI Ġframeworks Ġare Ġmore Ġpowerful , Ġbut Ġthis Ġis Ġa Ġnice Ġexample Ġof Ġthe Ġuseful ness Ġof Ġsome Ġsimple Ġlanguage Ġconstructs . Ċ Ċ ### ĠThe ĠBad Ċ Ċ Although ĠKotlin Ġis Ġgreat , Ġit âĢĻ s Ġnot Ġperfect . ĠHere Ġare Ġa Ġfew Ġaspects Ġof Ġthe Ġlanguage Ġthat ĠI âĢĻ m Ġnot Ġin Ġlove Ġwith . Ċ Ċ #### ĠNo Ġnamespaces Ċ Ċ Kotlin Ġallows Ġyou Ġto Ġdefine Ġfunctions Ġand Ġproperties Ġat Ġthe Ġtop Ġlevel Ġof Ġyour Ġfiles . ĠThat âĢĻ s Ġa Ġgreat Ġfeature , Ġbut Ġit Ġcan Ġcause Ġsome Ġconfusion Ġwhen Ġcombined Ġwith Ġthe Ġfact Ġthat Ġall Ġtop Ġlevel Ġdeclarations Ġare Ġreferenced Ġun qualified Ġfrom ĠKotlin . ĠThis Ġcan Ġsometimes Ġmake Ġit Ġdifficult Ġto Ġtell Ġwhat Ġa Ġfunction Ġis Ġwhen Ġreading Ġone Ġof Ġits Ġusage s . Ċ Ċ For Ġexample , Ġif Ġyou Ġdefine Ġa Ġtop Ġlevel Ġfunction : Ċ Ċ ``` kotlin Ċ fun Ġfoo () Ġ{... } Ċ ``` Ċ Ċ You Ġwill Ġcall Ġthat Ġfunction Ġas Ġfoo (). ĠIf Ġyou Ġhave Ġa Ġfunction Ġwith Ġthe Ġsame Ġname Ġin Ġa Ġdifferent Ġpackage , Ġit âĢĻ s Ġnot Ġobvious Ġfrom Ġlooking Ġat Ġthe Ġcall Ġsite Ġwhich Ġfunction Ġis Ġbeing Ġcalled . ĠYou Ġcan Ġfully Ġqual ify Ġthe Ġname Ġof Ġthe Ġfunction Ġwith Ġthe Ġentire Ġname Ġof Ġthe Ġpackage Ġthat Ġit âĢĻ s Ġdefined Ġin , Ġbut Ġgiven ĠJava âĢĻ s Ġconvention Ġof Ġvery Ġdeep Ġpackage Ġnames , Ġthat âĢĻ s Ġnot Ġideal . Ċ Ċ One Ġworkaround Ġis Ġto Ġapproximate Ġa Ġnamespace Ġby Ġusing Ġwith Ġa Ġsingleton Ġobject Ġclass . Ċ Ċ ``` kotlin Ċ object ĠFoo Actions Ġ{ ĠĠĊĠĠĠ Ġfun Ġfoo () Ġ{... } ĠĠ Ċ } Ċ ``` Ċ Ċ That Ġallows Ġyou Ġto Ġrefer Ġto Ġthe Ġfunction Ġas ĠFoo Actions . foo () Ġif Ġyou âĢĻ re Ġonly Ġcalling Ġthe Ġfunctions Ġfrom ĠKotlin , Ġbut Ġit âĢĻ s Ġnot Ġas Ġpretty Ġif Ġyou Ġhave ĠJava Ġcode Ġthat Ġneeds Ġto Ġcall Ġthat Ġfunction . ĠFrom ĠJava , Ġyou Ġhave Ġto Ġrefer Ġto Ġthe Ġfunction Ġas ĠFoo Actions . INSTANCE . foo (), Ġwhich Ġis Ġcertainly Ġnot Ġideal . ĠYou Ġcan Ġavoid Ġthe ĠINSTANCE Ġstep Ġby Ġannot ating Ġyour Ġfunction Ġwith Ġ@ Jvm Static , Ġwhich Ġis Ġabout Ġthe Ġbest Ġyou Ġcan Ġdo Ġcurrently . ĠThat âĢĻ s Ġnot Ġa Ġbig Ġdeal , Ġbut Ġit âĢĻ s Ġsome Ġboilerplate Ġthat Ġwouldn âĢĻ t Ġbe Ġnecessary Ġif ĠKotlin Ġhad Ġnamespaces . Ċ Ċ #### ĠNo Ġstatic Ġmodifier Ċ Ċ Following Ġon Ġthe Ġprevious Ġpoint , ĠKotlin Ġhas Ġun usual Ġhandling Ġof Ġstatic Ġfunction Ġand Ġproperty Ġdeclarations Ġthat Ġare Ġcalled Ġfrom ĠJava . ĠIt âĢĻ s Ġnot Ġbad , Ġbut Ġit Ġfeels Ġdir tier Ġthan Ġnecessary . ĠFor Ġexample , Ġthe ĠAndroid Ġ_ View _ Ġclass Ġdefines Ġsome Ġstatic Ġconstants Ġlike Ġ_ View . VISIBLE _ Ġand Ġstatic Ġmethods Ġlike ĠView . inflate : Ċ Ċ ``` kotlin Ċ public Ġclass ĠView Ġ{ ĠĠĊĠĠĠ Ġpublic Ġstatic Ġfinal Ġint ĠVIS IBLE Ġ= Ġ 0 x 0 0 0 0 0 0 0 0 ; ĠĠĊĠĠĠ Ġpublic Ġstatic Ġfinal Ġint ĠIN VISIBLE Ġ= Ġ 0 x 0 0 0 0 0 0 0 4 ; ĠĠĊĠĠĠ Ġpublic Ġstatic ĠView Ġinf late ( Context Ġcontext , Ġint Ġresource ) Ġ{... } ĠĠ Ċ } Ċ ``` Ċ Ċ The Ġdeclaration Ġis Ġsimple . ĠIn Ġcontrast , Ġhere âĢĻ s Ġthe Ġequivalent ĠKotlin : Ċ Ċ ``` kotlin Ċ class ĠView Ġ{ ĠĠĊĠĠĠ Ġcompanion Ġobject Ġ{ ĠĠĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĠĠĠĊĠĠĠĠĠĠĠ Ġval ĠVIS IBLE : ĠInt Ġ= Ġ 0 x 0 0 0 0 0 0 0 0 ĠĠĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĠĠĠĊĠĠĠĠĠĠĠ Ġval ĠIN VISIBLE : ĠInt Ġ= Ġ 0 x 0 0 0 0 0 0 0 4 ĠĠĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĠĠĊĠĠĠĠĠĠĠ Ġfun Ġinf late ( context : ĠContext , Ġresource : ĠInt ) Ġ{... } ĠĠĊĠĠĠ Ġ} ĠĠ Ċ } Ċ ``` Ċ Ċ Although Ġthe ĠKotlin Ġversion Ġisn âĢĻ t Ġter rible , Ġit âĢĻ s Ġmore Ġverbose Ġthan ĠI Ġwould Ġnormally Ġexpect Ġfrom Ġthe Ġlanguage . ĠIf Ġyou Ġskip Ġthe Ġannotations , Ġthen ĠJava Ġcode Ġwill Ġhave Ġto Ġuse Ġaw ful Ġsyntax Ġto Ġrefer Ġto Ġyour Ġfields : Ċ Ċ ``` kotlin Ċ // ĠWith Ġannotations : ĠĠ Ċ View . VISIBLE ; Ċ ``` Ċ Ċ ``` kotlin Ċ // Without Ġannotations : ĠĠ Ċ View . Companion . get VISIBLE (); Ċ ``` Ċ Ċ It Ġfeels Ġodd Ġthat Ġthere Ġare Ġno Ġbetter Ġways Ġto Ġcreate Ġstatic Ġfunctions Ġand Ġproperties . ĠI Ġknow Ġthat Ġcompanion Ġobjects Ġare Ġreal Ġobjects Ġand Ġcan Ġdo Ġstuff Ġlike Ġimplement Ġinterfaces , Ġbut Ġthat Ġdoesn âĢĻ t Ġfeel Ġlike Ġa Ġcomp elling Ġenough Ġuse Ġcase Ġto Ġcompletely Ġreplace Ġnormal Ġstatic Ġdeclarations . Ċ Ċ #### ĠAutomatic Ġconversion Ġof ĠKotlin Ġto ĠJava Ċ Ċ This Ġwas Ġthe Ġfirst Ġtopic Ġin Ġthe Ġlist Ġof Ġthings ĠI Ġlike Ġabout ĠKotlin , Ġand Ġit Ġworks Ġwell . ĠBut Ġbecause Ġit Ġwork Ġso Ġwell Ġ 8 0 % Ġof Ġthe Ġtime , Ġmany Ġof Ġthe Ġcases Ġwhere Ġit Ġfails Ġcan Ġbe Ġfru str ating . Ċ Ċ Javadoc s Ġare Ġoften Ġm angled , Ġespecially Ġany Ġparagraphs Ġthe Ġwrap Ġlines . ĠStatic Ġfields Ġand Ġmethods Ġare Ġconverted Ġto Ġplain Ġdeclarations Ġon Ġthe Ġcompanion Ġobject , Ġwhich Ġbreaks Ġany ĠJava Ġcode Ġthat Ġpreviously Ġcalled Ġthem Ġunless Ġyou Ġmanually Ġadd Ġ_ @ Jvm Field _ Ġor Ġ_ @ Jvm Static _, Ġrespectively . Ċ Ċ All Ġof Ġthese Ġproblems Ġwill Ġcertainly Ġget Ġfixed Ġas Ġthe ĠKotlin Ġteam Ġhas Ġmore Ġtime Ġto Ġwork Ġon Ġthe Ġconverter , Ġso ĠI âĢĻ m Ġoptim istic Ġin Ġthis Ġcase . Ċ Ċ #### ĠRequired Ġproperty Ġaccessor Ġsyntax Ċ Ċ Kotlin Ġhas Ġthe Ġgreat Ġsynt actic Ġs ugar Ġcalled ĠâĢľ property Ġaccessor Ġsyntax âĢĿ Ġthat Ġallows Ġyou Ġto Ġcall ĠJava Beans - style Ġgetters Ġand Ġset ters Ġas Ġif Ġthey Ġwere Ġa ĠKotlin Ġproperty . ĠSo Ġfor Ġexample , Ġyou Ġcan Ġcall Ġthe Ġ_ Activity . getContext () _ Ġmethod Ġby Ġwriting Ġ_ activity . context _ Ġinstead Ġof Ġwriting Ġthe Ġwhole Ġmethod Ġname . ĠIf Ġyou Ġuse Ġthe Ġactual Ġmethod Ġcall Ġin ĠKotlin , Ġyou Ġwill Ġget Ġa Ġlint Ġwarning Ġtelling Ġyou Ġto Ġuse Ġthe Ġproperty Ġsyntax Ġinstead . Ċ Ċ That âĢĻ s Ġdefinitely Ġa Ġnice Ġfeature , Ġbut Ġthere Ġare Ġa Ġfew Ġcases Ġwhere Ġmethod Ġnames Ġstart Ġwith Ġthe Ġword ĠâĢľ get âĢĿ, Ġbut Ġyou Ġdon âĢĻ t Ġwant Ġto Ġuse Ġthe Ġproperty Ġsyntax . ĠOne Ġcommon Ġcase Ġis Ġwith ĠJava âĢĻ s Ġatomic Ġclasses . ĠIf Ġyou Ġhave Ġa Ġ_ val Ġi Ġ= ĠAtomicInteger () _, Ġyou Ġmight Ġwant Ġto Ġcall Ġ_ i . get And Increment () _. ĠBut ĠKotlin Ġwants Ġyou Ġto Ġcall Ġ_ i . and Increment _. ĠThat âĢĻ s Ġclearly Ġnot Ġan Ġimprovement . Ċ Ċ You Ġcan Ġannotate Ġevery Ġcall Ġsite Ġwith Ġ_ @ Suppress ( âĢľ Use Property Access Syntax âĢĿ ) _, Ġbut Ġthat âĢĻ s Ġugly . ĠIt Ġwould Ġbe Ġmuch Ġbetter Ġif Ġthere Ġwas Ġa Ġway Ġto Ġannotate Ġfunctions Ġyou Ġwrite Ġwith Ġa Ġsimilar Ġannotation Ġthat Ġwould Ġtell Ġthe Ġlinter Ġthat Ġthe Ġfunction Ġshouldn âĢĻ t Ġbe Ġtreated Ġlike Ġa Ġproperty . Ċ Ċ #### ĠMethod Ġcount Ċ Ċ Writing Ġcode Ġin ĠKotlin Ġwill Ġcertainly Ġreduce Ġthe Ġnumber Ġof Ġlines Ġof Ġcode Ġin Ġyour Ġproject . ĠBut Ġit Ġwill Ġalso Ġprobably Ġincrease Ġthe Ġmethod Ġcount Ġof Ġthe Ġcompiled Ġcode , Ġwhich Ġis Ġof Ġcourse Ġa Ġdraw back Ġif Ġyou âĢĻ re Ġusing ĠAndroid . ĠThere Ġare Ġa Ġnumber Ġof Ġreasons Ġfor Ġthat , Ġbut Ġone Ġof Ġthe Ġlarger Ġcontributors Ġis Ġthe Ġway ĠKotlin Ġimplements Ġproperties . Ċ Ċ Un like ĠJava , Ġthe ĠKotlin Ġlanguage Ġdoesn âĢĻ t Ġprovide Ġany Ġway Ġto Ġdefine Ġa Ġbare Ġfield . ĠAll Ġval Ġand Ġvar Ġdeclarations Ġinstead Ġcreate Ġa Ġproperty . ĠThis Ġhas Ġthe Ġadvantage Ġof Ġallowing Ġyou Ġto Ġadd Ġa Ġget Ġor Ġset Ġdefinition Ġto Ġa Ġproperty Ġwhenever Ġyou Ġwant Ġwithout Ġbreaking Ġcode Ġthat Ġreferences Ġthe Ġproperty . ĠThat âĢĻ s Ġa Ġgreat Ġfeature Ġthat Ġremoves Ġthe Ġneed Ġto Ġwrite Ġdef ensive Ġgetters Ġand Ġset ters Ġin Ġthe Ġway Ġthat Ġyou Ġoften Ġdo Ġin ĠJava . Ċ Ċ That Ġfeature Ġcomes Ġat Ġa Ġcost , Ġthough . ĠEvery Ġpublic Ġ_ val _ Ġcauses ĠKotlin Ġto Ġgenerate Ġboth Ġa Ġbacking Ġfield Ġand Ġa Ġgetter Ġfunction Ġthat Ġcan Ġbe Ġcalled Ġfrom ĠJava Ġ_[ 4 ] _. ĠEvery Ġpublic Ġ_ var _ Ġwill Ġcause Ġboth Ġa Ġgetter Ġand Ġsetter Ġto Ġbe Ġgenerated . ĠFort un ately , Ġprivate Ġproperties Ġwith Ġdefault Ġgetters Ġand Ġset ters Ġare Ġgenerated Ġas Ġfields Ġand Ġdon âĢĻ t Ġcause Ġgetters Ġor Ġset ters Ġto Ġbe Ġgenerated . ĠIf Ġyou Ġwere Ġpreviously Ġexposing Ġa Ġlot Ġof Ġpublic Ġfields Ġin ĠJava Ġ( which Ġis Ġa Ġcommon Ġpractice Ġfor Ġconstants ), Ġyou Ġcan Ġend Ġup Ġwith Ġa Ġsur prising Ġincrease Ġin Ġmethod Ġcount . Ċ Ċ If Ġyou Ġare Ġclose Ġto Ġthe Ġmethod Ġlimit Ġin Ġyour Ġandroid Ġapp , ĠI Ġrecommend Ġusing Ġthe Ġworkaround Ġof Ġapplying Ġthe Ġ_ @ Jvm Field _ Ġannotation Ġon Ġpublic Ġconstants Ġfor Ġwhich Ġyou Ġdon âĢĻ t Ġexpect Ġto Ġneed Ġa Ġcustom Ġgetter Ġfor Ġin Ġthe Ġfuture . ĠThis Ġwill Ġprevent Ġthe Ġgetters Ġfrom Ġbeing Ġgenerated , Ġand Ġcan Ġcut Ġdown Ġon Ġyour Ġmethod Ġcount . Ċ Ċ It âĢĻ s Ġnot Ġall Ġbad , Ġthough . ĠAs ĠI Ġdiscussed Ġin Ġmy Ġarticle Ġon Ġ[ con verting Ġan Ġapp Ġto Ġ 1 0 0 % ĠKotlin ]( https :// medium . com / keep safe - engineering / lessons - from - con verting - an - app - to - 1 0 0 - kotlin - 6 8 9 8 4 a 0 5 dcb 6 ), Ġthe ĠKotlin Ġstandard Ġlibrary Ġis Ġsmall Ġand Ġcan Ġreplace Ġa Ġnumber Ġof Ġcommon ĠJava Ġlibraries Ġthat Ġare Ġmuch Ġlarger Ġonce Ġyou Ġdon âĢĻ t Ġneed Ġthem Ġin ĠJava Ġany Ġmore . ĠThanks Ġto Ġthe Ġstandard Ġlibrary , Ġthe Ġmethod Ġcount Ġin Ġthat Ġapp Ġdecrease d Ġafter Ġconverting Ġit Ġto ĠKotlin . ĠSo Ġas Ġlong Ġas Ġyou Ġavoid Ġthe Ġbig Ġareas Ġthat Ġcan Ġincrease Ġyour Ġmethod Ġcount , Ġyou Ġmay Ġend Ġup Ġahead Ġin Ġthe Ġend . Ċ Ċ ### ĠThe ĠU gly Ċ Ċ And Ġfinally , Ġhere Ġare Ġtwo Ġdesign Ġdecisions Ġthat Ġthe ĠKotlin Ġteam Ġmade Ġthat ĠI Ġstrongly Ġdis agree Ġwith , Ġand Ġthat ĠI Ġdon âĢĻ t Ġexpect Ġto Ġchange Ġin Ġthe Ġfuture . Ċ Ċ #### ĠSAM Ġconversion Ġand ĠUnit Ġreturning Ġlamb das Ċ Ċ This Ġone Ġis Ġa Ġreally Ġb aff ling Ġdesign Ġdecision . Ċ Ċ One Ġof Ġthe Ġbest Ġfeatures Ġof ĠKotlin Ġis Ġthe Ġway Ġit Ġem br aces Ġlambda Ġfunctions . ĠIf Ġyou Ġhave Ġa ĠJava Ġfunction Ġthat Ġtakes Ġa ĠSAM Ġinterface Ġas Ġa Ġparameter Ġ( an Ġinterface Ġwith Ġa ĠSingle ĠAbstract ĠMethod ): Ċ Ċ ``` kotlin Ċ public Ġvoid Ġregister Callback ( View . OnClickListener Ġr ) Ċ ``` Ċ Ċ You Ġcan Ġcall Ġit Ġby Ġpassing Ġa Ġplain Ġlambda Ġfrom Ġeither ĠKotlin Ġor ĠJava : Ċ Ċ ``` java Ċ // ĠJava ĠĠ Ċ register Callback (() Ġ-> Ġ{ Ġ/** Ġdo Ġstuff Ġ*/ Ġ}) Ċ ``` Ċ Ċ ``` kotlin Ċ // Kotlin ĠĠ Ċ register Callback Ġ{ Ġ/** Ġdo Ġstuff Ġ*/ Ġ} Ċ ``` Ċ Ċ This Ġis Ġgreat . ĠBut Ġtrying Ġto Ġdefine Ġa Ġsimilar Ġmethod Ġin ĠKotlin Ġis Ġin exp lic ably Ġharder . ĠThe Ġdirect Ġtranslation Ġis Ġcalled Ġthe Ġsame Ġfrom ĠJava , Ġbut Ġrequires Ġan Ġexplicit Ġtype Ġwhen Ġcalled Ġfrom ĠKotlin : Ċ Ċ ``` kotlin Ċ fun Ġregister Callback ( r : ĠView . OnClickListener ) Ċ ``` Ċ Ċ ``` kotlin Ċ // ĠKotlin . ĠNote Ġthat Ġparent hesis Ġare Ġrequired Ġnow ._ ĠĠ Ċ register Callback ( View . OnClickListener Ġ{ Ġ/** Ġdo Ġstuff Ġ*/ Ġ}) Ċ ``` Ċ Ċ That âĢĻ s Ġannoying Ġto Ġhave Ġto Ġtype Ġout , Ġespecially Ġif Ġyou Ġconvert Ġsome ĠJava Ġcode Ġto ĠKotlin Ġand Ġfind Ġout Ġthat Ġit Ġbreaks Ġexisting ĠKotlin Ġcode . Ċ Ċ The Ġid iom atic Ġway Ġto Ġdefine Ġthat Ġfunction Ġin ĠKotlin Ġwould Ġbe Ġwith Ġa Ġfunction Ġtype : Ċ Ċ ``` kotlin Ċ fun Ġregister Callback ( r : Ġ() Ġ-> ĠUnit ) Ċ ``` Ċ Ċ Which Ġallows Ġthe Ġnice Ġfunction Ġcall Ġsyntax Ġin ĠKotlin , Ġbut Ġsince Ġall ĠKotlin Ġfunctions Ġare Ġrequired Ġto Ġreturn Ġa Ġvalue , Ġthis Ġmakes Ġcalling Ġthe Ġfunction Ġfrom ĠJava Ġmuch Ġworse . ĠYou Ġhave Ġto Ġexplicitly Ġreturn ĠUnit Ġfrom ĠJava Ġlamb das , Ġso Ġexpression Ġlamb das Ġare Ġno Ġlonger Ġpossible : Ċ Ċ ``` kotlin Ċ register Callback (() Ġ-> Ġ{ ĊĠĠĠ Ġ/** Ġdo Ġstuff Ġ*/ ĠĠĊĠĠĠ Ġreturn ĠUnit . INSTANCE ; ĠĠ Ċ }) Ċ ``` Ċ Ċ If Ġyou âĢĻ re Ġwriting Ġa Ġlibrary Ġin ĠKotlin , Ġthere Ġisn âĢĻ t Ġany Ġgood Ġway Ġto Ġwrite Ġa Ġmethod Ġwith Ġa Ġfunction Ġparameter Ġthat Ġis Ġideal Ġto Ġcall Ġfrom Ġboth ĠJava Ġand ĠKotlin . ĠI Ġtry Ġto Ġwork Ġaround Ġthis Ġin Ġmy Ġ[ Flex Adapter ]( https :// github . com / aj alt / flex adapter ) Ġlibrary Ġby Ġproviding Ġover loads Ġfor Ġeach Ġmethod Ġwith Ġa Ġfunction Ġparameter Ġthat Ġtake Ġeither Ġa ĠSAM Ġinterface Ġor Ġa ĠKotlin Ġfunction Ġtype . ĠThat Ġlets Ġyou Ġhave Ġa Ġnice Ġcall Ġsyntax Ġfrom Ġboth Ġlanguages , Ġbut Ġmakes Ġthe Ġlibrary ĠAPI Ġless Ġconcise . Ċ Ċ Hope fully Ġthe ĠKotlin Ġdesign ers Ġchange Ġtheir Ġmind Ġand Ġallow ĠSAM Ġconversions Ġfor Ġfunctions Ġdefined Ġin ĠKotlin Ġin Ġthe Ġfuture , Ġbut ĠI âĢĻ m Ġnot Ġoptim istic . Ċ Ċ ### ĠClosed Ġby Ġdefault Ċ Ċ Every Ġdown side Ġto ĠKotlin ĠI âĢĻ ve Ġtalk ed Ġabout Ġso Ġfar Ġare Ġmostly Ġsmall Ġsyntax Ġdetails Ġthat Ġare Ġnot Ġquite Ġas Ġclean ĠI âĢĻ d Ġlike , Ġbut Ġaren âĢĻ t Ġa Ġbig Ġdeal Ġoverall . ĠBut Ġthere âĢĻ s Ġone Ġdesign Ġdecision Ġthat Ġis Ġgoing Ġto Ġcause Ġa Ġhuge Ġamount Ġof Ġpain Ġin Ġthe Ġfuture : ĠAll Ġclasses Ġand Ġfunctions Ġin ĠKotlin Ġare Ġclosed Ġby Ġdefault . ĠIt âĢĻ s Ġa Ġdesign Ġdecision Ġpushed Ġby ĠEffect ive ĠJava , Ġand Ġit Ġmight Ġsound Ġnice Ġin Ġtheory , Ġbut Ġit âĢĻ s Ġan Ġobviously Ġbad Ġchoice Ġto Ġanyone Ġwho âĢĻ s Ġhad Ġto Ġuse Ġa Ġbug gy Ġor Ġincomplete Ġthird - party Ġlibrary . Ċ Ċ > Ġ_ Make Ġall Ġof Ġyour Ġleaf Ġclasses Ġfinal . ĠAfter Ġall , Ġyou âĢĻ re Ġdone Ġwith Ġthe Ġproject âĢ Ĭ âĢĶ âĢ Ĭ cert ain ly Ġno Ġone Ġelse Ġcould Ġpossibly Ġimprove Ġon Ġyour Ġwork Ġby Ġextending Ġyour Ġclasses . ĠAnd Ġit Ġmight Ġeven Ġbe Ġa Ġsecurity Ġfl aw âĢ Ĭ âĢĶ âĢ Ĭ after Ġall , Ġisn âĢĻ t Ġjava . lang . String Ġfinal Ġfor Ġjust Ġthis Ġreason ? ĠIf Ġother Ġcod ers Ġin Ġyour Ġproject Ġcompl ain , Ġtell Ġthem Ġabout Ġthe Ġexecution Ġspeed Ġimprovement Ġyou âĢĻ re Ġgetting . âĢ Ĭ âĢĶ âĢ Ĭ _[ _ Ro edy ĠGreen , ĠHow Ġto ĠWrite ĠUn maint ain able ĠCode _ ]( http :// www . mind prod . com / j gloss / un main design . html ) Ċ Ċ The ĠKotlin Ġdocumentation Ġ[ act ually Ġhas Ġa Ġparagraph Ġtrying Ġto Ġdef end Ġthe Ġchoice ](# ), Ġso ĠI âĢĻ ll Ġaddress Ġthe Ġthree Ġreasons Ġthey Ġgive . Ċ Ċ #### ĠâĢľ Best Ġpractices Ġsay Ġthat Ġyou Ġshould Ġnot Ġallow Ġthese Ġhack s Ġanyway âĢĿ Ċ Ċ The Ġarguments Ġfor Ġclosed Ġinheritance Ġare Ġmostly Ġcentered Ġaround Ġthe ĠâĢľ Frag ile ĠBase ĠClass ĠProblem âĢĿ, Ġwhich Ġis Ġthe Ġidea Ġthat , Ġif Ġyou Ġallow Ġsomeone Ġto Ġsubclass Ġyour Ġlibrary Ġcode , Ġthey Ġcould Ġchange Ġthe Ġway Ġit Ġworks , Ġpotentially Ġcausing Ġbugs . ĠWhile Ġthat âĢĻ s Ġa Ġpossibility , Ġthere Ġare Ġlots Ġof Ġway Ġto Ġuse Ġa Ġlibrary Ġincorrectly Ġthat Ġwill Ġcause Ġbugs . ĠIf Ġyou Ġoverride Ġsome Ġfunctionality Ġin Ġa Ġclass , Ġit Ġobviously Ġyour Ġresponsibility Ġif Ġyou Ġbreak Ġsomething . Ċ Ċ I Ġuse Ġthe Ġword ĠâĢľ ob vious ly âĢĿ, Ġbecause Ġoverriding Ġfunctionality Ġis Ġthe Ġway Ġto Ġuse Ġa Ġlibrary Ġthat Ġmost Ġexplicitly Ġplaces Ġresponsibility Ġon Ġthe Ġuser . ĠI Ġtut ored ĠComputer ĠScience Ġstudents Ġfor Ġyears , Ġand Ġwhile Ġthey Ġmanaged Ġto Ġmake Ġnearly Ġevery Ġmistake Ġyou Ġcan Ġimagine , Ġthey Ġwere Ġnever Ġsur pri sed Ġwhen Ġthey Ġbroke Ġsomething Ġby Ġoverriding Ġa Ġmethod . ĠThere Ġare Ġmuch Ġmore Ġsub tle Ġways Ġto Ġbreak Ġa Ġlibrary Ġyou Ġuse , Ġlike Ġpassing Ġa Ġvalue Ġwith Ġthe Ġcorrect Ġtype Ġbut Ġwrong Ġunits , Ġor Ġfor getting Ġto Ġcall Ġa Ġrequired Ġmethod . Ċ Ċ I Ġappreciate Ġthe Ġapproach Ġof Ġwriting Ġcode Ġthat Ġhas Ġfewer Ġplaces Ġthat Ġcan Ġbreak , Ġand Ġmaking Ġclasses Ġfinal Ġmight Ġseem Ġto Ġdo Ġthat . ĠBut Ġit âĢĻ s Ġa Ġcert ainty Ġthat Ġlibraries Ġwill Ġbe Ġincomplete Ġor Ġincorrect , Ġand Ġyou Ġwill Ġeventually Ġneed Ġto Ġuse Ġone Ġof Ġthose Ġlibraries . ĠModify ing Ġthe Ġbehavior Ġof Ġa Ġclosed Ġclass Ġis Ġgoing Ġto Ġrequire Ġmuch Ġworse Ġhack s Ġthat Ġare Ġmore Ġlikely Ġto Ġresult Ġin Ġbugs Ġthan Ġif Ġyou Ġcould Ġjust Ġoverride Ġone Ġor Ġtwo Ġof Ġthat Ġclass âĢĻ s Ġmethods . Ċ Ċ But Ġyou Ġdon âĢĻ t Ġeven Ġhave Ġto Ġtake Ġmy Ġword Ġfor Ġit . ĠHere âĢĻ s Ġa Ġreal Ġworld Ġexample Ġthat Ġmight Ġhave Ġimpact ed Ġyou Ġpersonally Ġif Ġyou âĢĻ re Ġan ĠAndroid Ġdev : Ċ Ċ AppCompat Ġ 2 3 . 2 . 0 Ġfinally Ġsaw Ġthe Ġaddition Ġof Ġ[ Vector Draw ables ]( https :// plus . google . com /+ Android De velopers / posts / i TD m Fi Gr V ne ) Ġto Ġthe Ġsupport Ġlibrary . ĠThis Ġwas Ġa Ġvery Ġwelcome Ġaddition Ġthat Ġpromise d Ġto Ġreduce ĠA PK Ġsize Ġand Ġmemory Ġusage . Ġ[ Except Ġthat Ġit Ġcaused Ġa Ġhuge Ġmemory Ġleak Ġin Ġany Ġactivities Ġthat Ġtried Ġto Ġinf late Ġthem ]( https :// code . google . com / p / android / issues / detail ? id = 2 0 5 2 3 6 ). ĠThe Ġsupport Ġwas Ġ[ removed Ġa Ġcouple Ġweeks Ġlater ]( https :// plus . google . com /+ Android De velopers / posts / i TD m Fi Gr V ne ). Ċ Ċ Where Ġdid Ġthe Ġmemory Ġle aks Ġcome Ġfrom ? ĠIn Ġorder Ġto Ġ[ implement ĠVector Drawable Ġinfl ation ]( https :// medium . com /@ chr is ban es / appcompat - v 2 3 - 2 - age - of - the - vectors - 9 1 cb afa 8 7 c 8 8 ), Ġthe Ġsupport Ġlibrary Ġauthors Ġneeded Ġto Ġupdate Ġthe Ġway Ġ_ Context . get Drawable _ Ġis Ġimplemented . ĠBut Ġthat Ġfunction Ġis Ġfinal , Ġso Ġthey Ġhad Ġto Ġmake Ġevery ĠView Ġcreate Ġa Ġnew Ġcopy Ġof Ġa ĠResources Ġwrapper Ġthat Ġcould Ġhandle Ġ_ Vector Draw ables _. ĠBes ides Ġbeing Ġa Ġlarge Ġamount Ġof Ġwork , Ġthis Ġcaused Ġthe Ġvarious Ġwrapped ĠResources Ġto Ġbecome Ġout Ġof Ġsync , Ġand Ġto Ġuse Ġa Ġlarge Ġamount Ġof Ġmemory Ġdue Ġto Ġthe Ġduplication . ĠIf Ġthat Ġfunction Ġwasn âĢĻ t Ġfinal , Ġthat Ġmess Ġwouldn âĢĻ t Ġhave Ġhappened . Ċ Ċ #### ĠâĢľ People Ġsuccessfully Ġuse Ġother Ġlanguages Ġ( C ++, ĠC # ) Ġthat Ġhave Ġsimilar Ġapproach âĢĿ Ċ Ċ People Ġalso Ġsuccessfully Ġuse Ġlanguages Ġlike ĠPython Ġthat Ġallow Ġanything Ġat Ġall Ġto Ġbe Ġchanged Ġat Ġany Ġtime . ĠPython Ġhas ĠâĢľ non - public âĢĿ Ġmethods Ġlike Ġ__ as dict _ Ġthat Ġare Ġdocumented Ġto Ġby Ġimplementation Ġdetails . ĠIt Ġalso Ġhas Ġname Ġm angled Ġfunctions Ġlike Ġ___ intern _ Ġthat Ġare Ġharder Ġto Ġaccidentally Ġcall . ĠYou Ġcan Ġfreely Ġmonkey - patch Ġor Ġoverride Ġany Ġof Ġthose Ġfunctions Ġwhenever Ġyou Ġwant , Ġand ĠPython Ġwon âĢĻ t Ġcompl ain . Ċ Ċ In Ġfive Ġyears Ġof Ġfull Ġtime ĠPython Ġdevelopment , ĠI Ġcan âĢĻ t Ġthink Ġof Ġa Ġsingle Ġtime Ġwhen Ġsomeone Ġbroke Ġmy Ġcode Ġby Ġoverriding Ġa Ġfunction . ĠI Ġcan Ġthink Ġof Ġmany Ġinstances Ġwhere ĠI âĢĻ ve Ġaltered Ġa Ġnon - public Ġfunction Ġin Ġa Ġsafe , Ġcorrect Ġway Ġin Ġmuch Ġless Ġtime Ġthan Ġit Ġwould Ġhave Ġtaken Ġto Ġimplement Ġthe Ġsame Ġfunctionality Ġif ĠPython Ġprevent Ġme Ġfrom Ġdoing Ġso . Ċ Ċ I âĢĻ m Ġnot Ġadv oc ating Ġblind ly Ġalter ing Ġimplementation Ġdetail Ġof Ġevery Ġclass Ġyou Ġcome Ġin Ġcontact Ġwith , Ġbut Ġthere âĢĻ s Ġno Ġreason Ġto Ġmake Ġthat Ġimpossible Ġif Ġit Ġbecomes Ġnecessary . ĠA Ġcommon Ġsaying Ġin Ġthe ĠPython Ġcommunity Ġis Ġthat ĠâĢľ We âĢĻ re Ġall Ġconsent ing Ġad ult s Ġhere .âĢĿ ĠIf Ġyou Ġneed Ġto Ġmake Ġa Ġchange Ġto Ġone Ġof Ġmy Ġclasses , Ġyou Ġshould Ġbe Ġable Ġto . Ċ Ċ #### ĠâĢľ If Ġpeople Ġreally Ġwant Ġto Ġhack , Ġthere Ġstill Ġare Ġways : Ġyou Ġcan Ġalways Ġwrite Ġyour Ġhack Ġin ĠJava Ġand Ġcall Ġit Ġfrom ĠKotlin Ġ( see ĠJava ĠInter op ), Ġand ĠAs pect Ġframeworks Ġalways Ġwork Ġfor Ġthese Ġpurposes âĢĿ Ċ Ċ This Ġis Ġof Ġcourse Ġa Ġrid iculo us Ġargument . ĠYou Ġstill Ġcan âĢĻ t Ġoverride Ġclosed ĠKotlin Ġmethods Ġin ĠJava Ġwithout Ġun accept able Ġuse Ġof Ġreflection , Ġso Ġthis Ġdoesn âĢĻ t Ġhold Ġany Ġweight . Ċ Ċ Not Ġbeing Ġable Ġto Ġextend Ġfrom Ġa Ġlibrary Ġmeans Ġthat Ġit Ġbecomes Ġvery Ġdifficult Ġto Ġadd Ġfeatures Ġor Ġfix Ġbugs . ĠAnd Ġin Ġthe Ġreal Ġworld , Ġmore Ġlibraries Ġthan Ġnot Ġwill Ġneed Ġhack ing . ĠThat âĢĻ s Ġsimply Ġreality , Ġand Ġis Ġnever Ġgoing Ġto Ġchange . ĠA Ġlibrary Ġauthor Ġis Ġnever Ġgoing Ġto Ġbe Ġable Ġto Ġpredict Ġevery Ġpossible Ġuse Ġcase Ġthat Ġusers Ġwill Ġhave . ĠMaking Ġall Ġof Ġyour Ġclasses Ġfinal Ġonly Ġprevents Ġusers Ġfrom Ġeasily Ġimplementing Ġthe Ġfeatures Ġyou Ġcan âĢĻ t . ĠThis Ġwas Ġa Ġsur prising ly Ġdog matic Ġchoice Ġgiven Ġhow Ġpractical Ġthe ĠKotlin Ġdesign ers Ġwere Ġin Ġthe Ġrest Ġof Ġthe Ġlanguage . Ċ Ċ If Ġyou Ġwrite Ġa ĠKotlin Ġlibrary , Ġplease Ġmake Ġall Ġof Ġyour Ġpublic Ġfunctions Ġopen . ĠYou âĢĻ ll Ġmake Ġlife Ġeasier Ġon Ġyour Ġusers Ġin Ġthe Ġfuture . Ċ Ċ ### ĠCon clusion Ċ Ċ Kotlin Ġis Ġoverall Ġa Ġgreat Ġlanguage . ĠIt Ġis Ġmuch Ġless Ġverbose Ġthan ĠJava , Ġand Ġhas Ġan Ġexcellent Ġstandard Ġlibrary Ġthat Ġremoves Ġthe Ġneed Ġto Ġuse Ġa Ġlot Ġof Ġthe Ġlibraries Ġthat Ġmake ĠJava Ġlife Ġbe arable . ĠCon verting Ġan Ġapp Ġfrom ĠJava Ġto ĠKotlin Ġis Ġmade Ġmuch Ġeasier Ġthanks Ġto Ġautomated Ġsyntax Ġconversion , Ġand Ġthe Ġresult Ġis Ġalmost Ġalways Ġan Ġimprovement . ĠIf Ġyou âĢĻ re Ġan ĠAndroid Ġdeveloper , Ġyou Ġo we Ġit Ġto Ġyourself Ġto Ġgive Ġit Ġa Ġtry . Ċ Ċ At Ġ[ Keep safe ]( https :// www . get keep safe . com /), Ġall Ġnew ĠAndroid Ġdevelopment Ġis Ġin ĠKotlin , Ġand Ġlegacy ĠJava Ġcode Ġis Ġst ead ily Ġbeing Ġconverted Ġto ĠKotlin Ġas Ġwe Ġmake Ġchanges Ġto Ġit . Ċ Ċ Inter ested Ġin Ġworking Ġwith Ġus ? ĠHave Ġa Ġlook Ġat Ġour Ġ[ job Ġopen ings ]( https :// jobs . le ver . co / keep safe ). Ċ Ċ **[ 1 ]** ĠIn Ġthe Ġcase Ġof Ġa Ġ_ late init _ Ġproperty , Ġ_ kotlin . Un initialized Property AccessException _ Ġwill Ġbe Ġthrown , Ġwhere Ġthe Ġ_ Deleg ates . notNull _ Ġwill Ġthrow Ġan Ġ_ IllegalStateException _. Ċ Ċ **[ 2 ]** ĠThere Ġare Ġsome Ġdetails Ġabout Ġ_ late init _ Ġthat Ġare Ġworth Ġnot ing , Ġespecially Ġif Ġyou Ġplan Ġon Ġaccessing Ġa Ġ_ late init _ Ġproperty Ġfrom ĠJava Ġcode . ĠFirst Ġis Ġthat Ġ_ late init _ Ġcannot Ġbe Ġapplied Ġto Ġprimitive Ġtypes Ġsuch Ġas Ġ_ Int _ Ġor Ġ_ Double _. ĠThe Ġsecond Ġis Ġthat Ġa Ġ_ late init _ Ġproperty Ġis Ġbacked Ġby Ġa Ġfield Ġwith Ġthe Ġsame Ġvisibility Ġas Ġthe Ġproperty , Ġand Ġthis Ġfield Ġis Ġvisible Ġfrom ĠJava . ĠAdditionally , Ġthat Ġbacking Ġfield Ġcan Ġbe Ġfreely Ġset Ġto Ġnull Ġfrom ĠJava . ĠIf Ġany Ġof Ġthose Ġare Ġissues Ġfor Ġyour Ġuse Ġcase , Ġ_ Deleg ates . notNull _ Ġmay Ġbe Ġa Ġbetter Ġchoice . Ċ Ċ **[ 3 ]** ĠThe Ġlazy Ġ_ Sequence _ Ġoperators Ġcan Ġout perform Ġthe Ġeager Ġversions Ġby Ġup Ġto Ġ 2 0 %, Ġbut Ġonly Ġonce Ġlist Ġsizes Ġstart Ġgrowing Ġvery Ġlarge . ĠFor Ġlists Ġunder Ġa Ġmeg abyte Ġor Ġso Ġin Ġsize , Ġthe Ġlazy Ġversions Ġoften Ġperform Ġthe Ġsame Ġor Ġworse Ġthan Ġthe Ġeager Ġversions . Ċ Ċ **[ 4 ]** ĠThis Ġis Ġa Ġbit Ġof Ġa Ġsimpl ification . ĠKotlin Ġwill Ġonly Ġgenerate Ġa Ġbacking Ġfield Ġif Ġyou Ġdon âĢĻ t Ġdefine Ġa Ġget Ġfunction , Ġor Ġif Ġthe Ġdefined Ġget Ġfunction Ġdoesn âĢĻ t Ġreference Ġthe Ġimplicit Ġ_ field _ Ġidentifier . Ċ Ċ """ Ċ Ċ Article ( ĊĠ Ġtitle Ġ= Ġ" Kotlin : ĠThe ĠGood , ĠThe ĠBad , Ġand ĠThe ĠU gly ", ĊĠ Ġurl Ġ= Ġ" https :// medium . com / keep safe - engineering / kotlin - the - good - the - bad - and - the - ug ly - bf 5 f 0 9 b 8 7 e 6 f #. pr w ij 1 b 6 d ", ĊĠ Ġcategories Ġ= ĠlistOf ( ĊĠĠĠ Ġ" Kotlin " ĊĠ Ġ), ĊĠ Ġtype Ġ= Ġarticle , ĊĠ Ġlang Ġ= ĠEN , ĊĠ Ġauthor Ġ= Ġ" AJ ĠAlt ", ĊĠ Ġdate Ġ= ĠLocalDate . of ( 2 0 1 6 , Ġ 8 , Ġ 2 0 ), ĊĠ Ġbody Ġ= Ġbody Ċ ) Ċ