Dëshironi të dini gjithçka. gjuha Kotlin

Gjuha e programimit Kotlin, e zhvilluar nga kompania e Shën Petersburgut JetBrains, është bërë gjuha zyrtare e zhvillimit për Android. Kjo u njoftua zyrtarisht në konferencën e Google I/O. Ekipi Kotlin drejtohet nga i diplomuari në Universitetin ITMO, Andrey Breslav. Pse Kotlin është kaq i dashur nga gjigandi i IT në mesin e shumë gjuhëve të tjera "të reja", si dhe pse shfaqen gjuhë të reja programimi në përgjithësi, lexoni në komentet e ekspertëve dhe koleksionin e informacionit ITMO.NEWS.

Si zhvillohen gjuhët e programimit

Sipas vlerësimeve të ndryshme, tashmë ka më shumë se dy mijë gjuhë të ndryshme programimi në botë. Përditësimet po lëshohen vazhdimisht për gjuhët e vjetra dhe po shfaqen edhe gjuhë të reja. Kur sintaksa e një gjuhe nuk ndryshon, por vetëm bëhet më e ndërlikuar dhe e zgjeruar, zhvilluesit i duhet vetëm pak praktikë për të vazhduar të shkruajë në gjuhën e tij të preferuar. Ndonjëherë struktura e vetë gjuhës ndryshon, dhe më pas programuesi ndonjëherë duhet të mësojë përsëri, duke iu përshtatur gjuhës së përditësuar. Në mënyrë tipike, kalimi në një strukturë të re ndodh gradualisht dhe në pjesë, domethënë, vetëm 10-20% e kodit të programit fillon të shkruhet duke përdorur gjuhën e re.

« Programuesit nuk ishin plotësisht të kënaqur me gjuhët C++ dhe Java, sepse këto janë gjuhë mjaft komplekse dhe e para është më e vështirë se e dyta. Prandaj, u shfaq gjuha Scala, të cilën shumë programues e pëlqejnë, por është gjithashtu shumë komplekse. Përvoja e madhe e JetBrains në krijimin e mjeteve të zhvillimit të programeve për gjuhë të ndryshme programimi e lejoi atë të krijojë gjuhën Kotlin në shtatë vjet, e cila është plotësisht e pajtueshme me Java, por më e thjeshtë dhe më e përshtatshme se ajo. Gjuhët e programimit janë duke u zhvilluar vazhdimisht; Pavarësisht kësaj, çdo gjuhë është më efektive në një fushë të caktuar ku përdoret më shpesh. Ekziston edhe një drejtim në krijimin e gjuhëve kur ato zhvillohen për një fushë specifike lëndore“, komentoi kreu i Departamentit të Teknologjisë së Programimit në Universitetin ITMO.


Sot, disa kompani madje përpilojnë vlerësimet e tyre gjuhësore. Për shembull, kompania TIOBE, e specializuar në vlerësimin e cilësisë së softuerit, ka llogaritur çdo muaj indeksin e popullaritetit të gjuhëve të caktuara që nga viti 2001. Lista e krijuar përmban 50 rreshta dhe në mënyrë që një gjuhë programimi të përfshihet në indeks, zhvilluesit duhet t'i shkruajnë një letër përkatëse kompanisë. Llogaritja bazohet në të dhënat nga 25 motorë kërkimi në internet. Deri më tani, Java kryeson me një diferencë të madhe në renditje, e ndjekur nga C. Njëkohësisht, hartuesit e listës theksojnë se gjatë vitit të kaluar, të dyja gjuhët e programimit janë bërë më pak të njohura, me rreth 6%. Në të njëjtën kohë, TIOBE tregon se C ishte gjuha nr. 1 deri në vitin 2002 dhe Java ishte në vendin e 14-të në 1997, por pesë vjet më vonë ajo zëvendësoi C-në në pozicionin e parë.

Ju mund të jepni një leksion të shkëlqyeshëm për historinë e zhvillimit të gjuhëve: kuratori i programeve akademike në Yandex, drejtor i qendrës për garat studentore në Fakultetin e Shkencave Kompjuterike në Shkollën e Lartë të Ekonomisë flet për mënyrën se si gjuhët C , PHP, Ruby dhe Java u shfaqën. Mikhail Gustokashin. Pedagogu thekson se për çdo detyrë duhet zgjedhur një gjuhë e ndryshme programimi. Për shembull, ai thotë se për industrinë ushtarake është më mirë të shkruash në Pascal të vjetër, një gjuhë që lindi në vitin 1970! Pse? Sepse është më i besueshëm. Aplikacionet e biznesit mund të shkruhen në Java sepse kjo gjuhë është gjithashtu mjaft e besueshme, por shumë më e lehtë për t'u përdorur. Eksperti thekson gjithashtu se është e rëndësishme të ruhet interesi për gjuhën midis programuesve duke krijuar një komunitet zhvilluesish që shkruajnë në këtë gjuhë. Nëse krijohet një infrastrukturë rreth një gjuhe të re dhe njerëzit mblidhen për ta përdorur atë, vetëm atëherë gjuha do të bëhet e njohur. Nga rruga, zhvilluesit e Kotlin miratuan gjithashtu këtë strategji.

Pak për Kotlin

Gjuha e programimit Kotlin filloi të zhvillohej në kompaninë JetBrains në Shën Petersburg në vitin 2010. Lëshimi zyrtar i produktit u lëshua në vitin 2016. Gjuha e mori këtë emër për nder të ishullit në Gjirin e Finlandës në të cilin ndodhet Kronstadt. Nga një rastësi interesante, emri i gjuhës popullore Java është gjithashtu emri i një ishulli në Indonezi. Rastësia ndoshta nuk është e rastësishme. Siç thuhet në njoftimin për shtyp, Kotlin duhet të punojë kudo ku funksionon Java, dhe një nga qëllimet ishte të krijonte një produkt që mund të përdoret në projekte të përziera që krijohen në disa gjuhë.


Siç vërejnë autorët e Kotlin, gjëja më e rëndësishme për ta ishte krijimi i një produkti "pragmatik". Kjo do të thotë se ata nuk ishin të fokusuar vetëm në rregullimin e gabimeve dhe përmirësimin e produktit, gjë që do ta bënte çdo programues, por donin të krijonin një mjet të dobishëm.

« Mjetet e zhvillimit, duke përfshirë gjuhët e programimit, janë vazhdimisht në zhvillim. Gjuhët ndryshojnë nga mjetet e tjera në atë që janë mjaft të vështira për t'u zhvilluar në mënyrë evolucionare. Versioni i ri i gjuhës duhet të mbështesë të gjitha programet ekzistuese. Kjo kufizon mundësitë për zhvillimin e gjuhëve ekzistuese dhe krijon nevojën për shfaqjen e gjuhëve të reja. Faktori që përcakton suksesin e një gjuhe të re programimi është, para së gjithash, komoditeti për zhvilluesit. Përveç të qenit konciz dhe shprehës, Kotlin është shumë i pajtueshëm me kodin Java: mund të përdorni të gjitha bibliotekat ekzistuese dhe madje të përzieni kodin në dy gjuhë në një projekt, kështu që nuk ka vështirësi të veçanta në tranzicion.“, komentoi menaxheri i projektit Kotlin në JetBrains, i diplomuar në Universitetin ITMO.

Pse Google e donte Kotlin

Në faqen zyrtare të internetit, zhvilluesit e Android shkruajnë se kanë vëzhguar "ngritjen" e Kotlin viteve të fundit. Punonjësit e Google nuk kanë turp ta përshkruajnë gjuhën si mbresëlënëse, koncize, fuqizuese dhe të këndshme për të punuar. Ka rritur produktivitetin: kodi i programit në të është mesatarisht 40% më i shkurtër se në gjuhët e tjera, dhe Kotlin gjithashtu ju lejon të shmangni disa gabime në kod. Një nga faktorët përcaktues për popullaritetin e Kotlin në Google ishte se ai është i pajtueshëm me Java, e cila tashmë përdoret në zhvillimin e aplikacioneve për Android.

Tani, kur programuesit fillojnë të krijojnë një aplikacion të ri në mjedisin zyrtar të zhvillimit të Android Studio, ata mund të aktivizojnë menjëherë shtojcën “Kotlin support”. Ju gjithashtu mund të konvertoni linjat e krijuara tashmë të kodit në gjuhë të tjera në gjuhën Kotlin, të futni blloqe në gjuhë të tjera në linja kodi në Kotlin. Në të ardhmen, do të zhvillohen më shumë biblioteka dhe mjete për gjuhën, do të zhvillohen më shumë materiale trajnimi dhe do të jetë më e lehtë për të gjetur zgjidhje për problemet e mundshme.

« Mungesa e garancive të mbështetjes gjuhësore nga Google dekurajoi shumë zhvillues që të kalonin në Kotlin. Edhe nëse ju pëlqen vërtet gjuha,Një programues gjithmonë mendon për rrezikun që në një moment kjo gjuhë thjesht të ndalojë së punuari. Tani ka një garanci që Kotlin nuk do të ndalojë së punuari dhe ne presim që numri i përdoruesve të gjuhës të rritet ndjeshëm. Do të ishte e natyrshme të supozohej se shumë kompani përfundimisht do të kalojnë plotësisht në Kotlin, megjithëse teknikisht asgjë nuk i detyron ata ta bëjnë këtë, është thjesht një çështje preference.“- theksoi Andrey Breslav.

Ai shtoi se Kotlin po zhvillohet në mënyrë shumë aktive. Ekipi i zhvillimit aktualisht është duke punuar në sistemin e ndërtimit, shpejtësinë e përpilimit, përmirësimin e performancës IDE, shtimin e veçorive të reja në paketën e veglave, duke përfshirë ato që lidhen me integrimin në Android Studio. Po punohet gjithashtu për projekte me shumë platforma (mundësia për të përpiluar të njëjtin kod për disa platforma), dhe një numër përmirësimesh gjuhësore janë në fazën e projektimit.


Google theksoi gjithashtu se janë frymëzuar nga koncepti i gjuhës Kotlin, sipas të cilit ajo ka qenë dhe do të mbetet gjithmonë falas për zhvilluesit, domethënë një projekt me kod të hapur. Kjo do të thotë që gjuha nuk është e lidhur me ndonjë kompani të caktuar dhe kodi burim shpërndahet nën një licencë falas. Ju mund ta shkarkoni produktin. Për të mbështetur zhvillimin e Kotlin, Google dhe JetBrains do të krijojnë një partneritet jofitimprurës. Gjithashtu, si pjesë e “misionit” të Android, është shumë e rëndësishme që autorët e Kotlin të krijojnë një komunitet njerëzish rreth produktit të tyre, të cilët janë të përfshirë profesionalisht në zhvillimin e kësaj gjuhe dhe duan të ndajnë përvojën e tyre. Për shembull, në nëntor konferenca Kotlin do të mbahet në Shtetet e Bashkuara dhe zhvilluesit mund të marrin gjithashtu lajme dhe këshilla të përditshme rreth produktit softuer dhe të takohen në nivel lokal.

Nga rruga, vetë projekti Android Studio u zhvillua në bazë të mjedisit të zhvillimit të softuerit IntelliJ IDEA, i cili u krijua gjithashtu nga JetBrains. Por pavarësisht bashkëpunimit të ngushtë, kompania e Shën Petersburgut thekson se nuk flitet për ndonjë shitje të JetBrains te gjigandi amerikan i IT. Në të njëjtën kohë, Koltin nuk do të jetë i dizajnuar vetëm për Android. Qëllimi i kompanisë është ta bëjë gjuhën e programimit të përshtatshme për platforma të ndryshme zhvillimi.

Vitet e fundit, ka pasur nevojë për një gjuhë të re që përpilohet në bytekod portativ për makinën virtuale Java. Janë shfaqur disa projekte për të krijuar gjuhë të tilla, dhe një prej tyre është Kotlin, një gjuhë statike e orientuar drejt objektit.

11/07/2011 Andrey Breslav

Vitet e fundit, ka pasur nevojë për një gjuhë të re që përpilohet në bytekod portativ për makinën virtuale Java. Janë shfaqur disa projekte për të krijuar gjuhë të tilla, një prej të cilave është Kotlin, një gjuhë statike e orientuar drejt objektit të shtypur, e pajtueshme me Java dhe e destinuar për zhvillimin e aplikacioneve industriale.

Historia e zhvillimit të gjuhëve "alternative" në platformën Java shkon më shumë se një dekadë, por gjuhë të tilla janë përhapur vetëm relativisht kohët e fundit. JRuby, Groovy dhe Clojure janë rritur në popullaritet me gjuhët e shtypura në mënyrë dinamike, ndërsa gjuhët e shtypura në mënyrë statike përfshijnë Scala, Fantom dhe Gosu. Vetë gjuha Java gjithashtu nuk qëndron ende, por zhvillimi i saj është i ndërlikuar si nga nevoja për të ruajtur përputhshmërinë e prapambetur ashtu edhe nga fati i vështirë i Sun Microsystems, i cili u përvetësua nga Oracle Corporation.

Në këtë sfond, projekti i ri JetBrains, i koduar Kotlin (theksi në "o"), nga njëra anë, duket pothuajse si një haraç për modën, dhe nga ana tjetër, është i rrethuar nga një numër i dukshëm konkurrentësh. Megjithatë, ne ndihemi mjaft të sigurt në këtë situatë dhe ka disa arsye për këtë. Së pari, JetBrains ka zhvilluar mjedise të integruara zhvillimi për një sërë gjuhësh programimi (shumë prej të cilave funksionojnë në platformën Java) për më shumë se një dekadë, dhe ka ndërtuar një ekip të fortë specialistësh dhe përvojë të konsiderueshme në gjuhët e programimit dhe të ngjashme. teknologjive. Së dyti, nuk mund të themi se ndonjë gjuhë ekzistuese në platformën Java i plotëson plotësisht nevojat tona dhe ne besojmë, bazuar në reagimet paraprake nga programuesit në mbarë botën, se kolegët tanë në kompani të tjera po përjetojnë vështirësi të ngjashme.

Zhvillimi i projektit Kotlin filloi në verën e vitit 2010, në korrik 2011, projekti u shpall zyrtarisht dhe një përshkrim i gjuhës u postua në faqen e internetit. Lëshimi i një versioni beta publik të përpiluesit është planifikuar për në fillim të vitit 2012.

Gjatë krijimit të gjuhës, ne u udhëhoqëm nga një sërë kërkesash që duken më të rëndësishmet për një projekt të tillë.

Java e përputhshme. Platforma Java vjen e para ekosistem: përveç produkteve "zyrtare" të Oracle, ai përfshin shumë projekte me burim të hapur: biblioteka dhe korniza të profileve të ndryshme, mbi bazën e të cilave janë ndërtuar një numër i madh aplikacionesh. Prandaj, për një gjuhë të përpiluar për këtë platformë, përputhshmëria me kodin ekzistues që është shkruar në Java është shumë e rëndësishme. Në të njëjtën kohë, është e nevojshme që projektet ekzistuese të kalojnë gradualisht në gjuhën e re, domethënë, jo vetëm kodi Kotlin duhet të thërrasë lehtësisht kodin Java, por edhe anasjelltas.

Garancitë statike të korrektësisë. Kur përpilohet kodi në një gjuhë të shtypur në mënyrë statike, ndodhin shumë kontrolle për të siguruar që disa gabime të mos ndodhin në kohën e ekzekutimit. Për shembull, përpiluesi Java garanton që objektet mbi të cilat metoda të caktuara quhen "dinë se si" për t'i ekzekutuar ato, domethënë që këto metoda zbatohen në klasat përkatëse. Fatkeqësisht, përveç kësaj prone shumë të rëndësishme, Java nuk garanton pothuajse asgjë. Kjo do të thotë që programet e përpiluara me sukses dështojnë me gabime në kohën e ekzekutimit (duke ngritur përjashtime). Një shembull i dukshëm është çreferencimi i referencës null, i cili hedh një NullPointerException në kohën e ekzekutimit. Një kërkesë e rëndësishme për gjuhën e re është forcimi i garancive statike. Kjo do të lejojë që më shumë gabime të zbulohen në kohën e përpilimit dhe në këtë mënyrë të zvogëlojë kostot e testimit.

Shpejtësia e përpilimit. Kontrollet statike e bëjnë programimin më të lehtë, por ato ngadalësojnë kompilimin dhe duhet të arrihet një ekuilibër. Përvoja e krijimit të gjuhëve me një sistem të fuqishëm të tipit (Scala është shembulli më i mrekullueshëm) tregon se ky ekuilibër nuk është i lehtë për t'u gjetur: përpilimi shpesh bëhet i papranueshëm i gjatë. Në përgjithësi, një karakteristikë e tillë e një gjuhe si koha e përpilimit të projektit mund të duket e një rëndësie dytësore, por në kushtet e zhvillimit industrial, kur vëllimet e kodit të përpiluar janë shumë të mëdha, rezulton se ky faktor është shumë i rëndësishëm - në fund të fundit, ndërsa kodi është përpiluar, programuesi shpesh nuk mund të vazhdojë të punojë. Në veçanti, përpilimi i shpejtë është një nga avantazhet e rëndësishme të Java mbi C++, dhe Kotlin duhet ta ruajë këtë avantazh.

Konciziteti. Dihet që programuesit shpesh shpenzojnë më shumë kohë duke lexuar kodin sesa duke e shkruar atë, kështu që është e rëndësishme që konstruktet e disponueshme në një gjuhë programimi t'ju lejojnë të shkruani programe në mënyrë koncize dhe të qartë. Java konsiderohet një gjuhë ceremoniale dhe Kotlin synon të përmirësojë situatën në këtë drejtim. Fatkeqësisht, metodat strikte për vlerësimin e gjuhëve për sa i përket koncizitetit të tyre janë mjaft të zhvilluara dobët, por ka kritere indirekte; një prej tyre është aftësia për të krijuar biblioteka, puna me të cilat është afër përdorimit gjuhë specifike për domenin(Gjuhë specifike për domenin, DSL). Për të krijuar biblioteka të tilla, kërkohet një fleksibilitet i caktuar sintaksor në lidhje me ndërtime të rendit më të lartë; Më të zakonshmet janë funksionet e rendit më të lartë, domethënë funksionet që marrin si parametra funksione të tjera.

Aksesueshmëria për studim. Kontrollet komplekse statike, sintaksa fleksibël dhe konstruksionet e rendit më të lartë e bëjnë gjuhën komplekse dhe të vështirë për t'u mësuar, kështu që është e nevojshme të kufizohet grupi i veçorive të mbështetura në një farë mase për ta bërë gjuhën të arritshme për mësim. Gjatë zhvillimit të Kotlin, përvoja e Scala dhe gjuhëve të tjera moderne u mor parasysh dhe konceptet tepër komplekse nuk u përfshinë në gjuhë.

Mbështetje instrumentale. Programuesit modernë përdorin në mënyrë aktive mjete të ndryshme të automatizuara, vendin qendror ndër të cilët e zënë mjedise të integruara zhvillimi(Integrated Development Environment, IDE). Përvoja e dekadave në JetBrains tregon se veçori të caktuara gjuhësore mund ta bëjnë të vështirë mbështetjen e veglave. Kur zhvillojmë Kotlin, ne e marrim parasysh këtë fakt dhe krijojmë një IDE njëkohësisht me një përpilues.

Elementet bazë të gjuhës

Funksione. Kotlin është një gjuhë e orientuar nga objekti, por, ndryshe nga Java, lejon që funksionet të deklarohen jashtë klasave. Java përdor metoda statike për këto qëllime, gjë që rezulton në klasa që në fakt nuk janë statike: instancat e tyre nuk krijohen kurrë, por thirren vetëm metoda statike.

Deklaratat në Kotlin kombinohen në hapësirat e emrave(Hapësira e emrave), dhe funksioni mund të deklarohet direkt brenda hapësirës së emrave:

hapësira e emrit shembull ( argëtim max(a: Int, b: Int) : Int ( nëse(një kthim kthimi b))

Deklaratës së funksionit i paraprin një fjalë kyçe argëtim, dhe llojet e parametrave specifikohen pas dy pikave pas emrit të parametrit. Lloji i kthimit të një funksioni shënohet në mënyrë të ngjashme. Kjo sintaksë ndjek traditën e gjuhëve të "botës funksionale" si ML dhe Scala. E bën të lehtë heqjen e shënimeve të tipit nëse lloji mund të jetë i tërhequr nga kompajleri nga konteksti automatikisht.

Variablat në Kotlin, si në Scala, ato deklarohen duke përdorur fjalë kyçe val(ndryshoret e pandryshueshme) dhe var(e ndryshueshme):

var Shuma e mëkatit: Dyfish = 0.0 për(x në xs) { val y = sin(x) sinShuma += y )

Në këtë shembull, lloji i ndryshores së pandryshueshme y është lënë jashtë sepse përpiluesi mund ta konkludojë atë automatikisht nga vlera e anës së djathtë të përkufizimit të ndryshores. Lloji i variablit të ndryshueshëm sinSum është specifikuar në mënyrë eksplicite vetëm për të demonstruar sintaksën e duhur; kompajleri ka informacion të mjaftueshëm për të konstatuar llojin edhe në këtë rast.

Klasat. Mjeti kryesor i zbërthimit në Kotlin, si në gjuhët e tjera të orientuara nga objekti, janë klasat. Kur deklaroni një klasë, lista e parametrave të konstruktorit tregohet drejtpërdrejt në kokë:

klasës IntPair(x: Int, y: Int) (...)

Instancat e një klase krijohen duke thirrur drejtpërdrejt konstruktorin; fjalë kyçe i ri në Kotlin nuk ka:

val xy = IntPair (x, y)

Kreu i klasës gjithashtu përmban një listë parametrat tipikë(gjenerike) në kllapa këndore dhe lista e superllojeve, domethënë llojet nga të cilat trashëgon kjo klasë, të ndara me dy pika:

klasës Lista ime (gjatësia: Int): Lista , Serializueshme (...)

Tiparet. Një klasë mund të trashëgojë nga një klasë ose nga disa tipare(tipar – fjalë për fjalë “tipar karakteristik”, tipar). Tiparet janë të ngjashme me klasat në atë që ato gjithashtu përcaktojnë llojet, mund të kenë gjithashtu funksione anëtare dhe të trashëgojnë nga tipare të tjera. Dallimi kryesor është se tiparet nuk kanë konstruktorë dhe, si rezultat, nuk mund të kenë shteti(fushat). Mund të themi se tiparet janë ndërfaqe të njohura nga gjuha Java vetëm funksionet në to mund të kenë një zbatim. Kufizimet e vendosura në tipare shmangin vështirësitë që lidhen me trashëgiminë e shumëfishtë të klasave.

Funksionet e jashtme. Një mekanizëm tjetër për "zgjerimin" e llojeve në Kotlin janë funksionet e jashtme (funksionet e zgjerimit). Funksione të tilla mund të deklarohen jashtë një klase dhe përsëri të thirren sikur të ishin deklaruar brenda. Këtu është një shembull i një deklarate të funksionit të jashtëm për llojin Int:

argëtim Int.abs() : Int ( nëse(kjo ktheje - kjo tjetër ktheje këtë }

Lloji që shtrihet një funksion i caktuar tregohet përpara emrit të tij dhe ndahet me një pikë. Kjo korrespondon me deklarimin e një parametri "të nënkuptuar", i cili tregohet brenda funksionit me fjalën kyçe kjo. Për shembull, në shembullin tonë, funksioni abs() zgjeron llojin Int dhe parametrin implicit kjoështë një numër i plotë. Një funksion i tillë mund të thirret duke përdorur operacionin "pik", ashtu si funksionet e anëtarëve të klasës:

val x = (-1).abs()

Kjo sintaksë ju lejon të zbatoni vetëm funksionalitetin minimal të nevojshëm në klasa pa dëmtuar lexueshmërinë e programit.

Funksionet e jashtme lidhen në mënyrë statike, domethënë nuk janë virtuale.

Strukturat e kontrollit. Kur

Kotlin mbështet konstruktet e kontrollit tradicional për gjuhët imperative nëse, për Dhe derisa, për të cilën nuk do të ndalemi në detaje, si dhe dizajni kur- Operacioni i degëzimit, i cili mund të konsiderohet si një version i zgjeruar i operatorit tradicional kaloni:

kur(x) ( 1 => shtyp ("Një") 2, 3 => shtyp ("Dy ose tre") tjetër=> printim ("Numër i panjohur") )

Në të majtë të shenjës "=>" është një shprehje ose një listë shprehjesh e ndarë me presje gjendje. Nëse argument dizajne kur(në shembullin tonë, ndryshorja x) është e barabartë me të paktën një nga këto shprehje, trupi i kësaj gjendjeje ekzekutohet, domethënë shprehja ose blloku i treguar në të djathtë të shenjës "=>". Kushtet kontrollohen në mënyrë sekuenciale, nga lart poshtë. Nëse asnjë nga kushtet nuk plotësohet, kodi i specifikuar pas ekzekutimit të fjalës tjetër. Ndryshe nga kaloni, duke përdorur kur kushtet nuk janë etiketa, kështu që nuk ka nevojë të përfundoni trupin e kushtit me fjalën thyej.

Përveç një krahasimi të thjeshtë për barazi, kur ju lejon të kontrolloni nëse një argument i përket një koleksioni duke përdorur operacionin :

kur(x) ( set => print ("në grup") 1..10 => shtyp ("1..10") tjetër=> print ("Dega e parazgjedhur") )

Pas fjalës kyçe specifikohet një shprehje e çdo lloji që mbështet metodën contain(). Në mënyrë të veçantë, një koleksion mund të specifikohet (si në kushtin e parë në këtë shembull) ose intervali(si në të dytin). Boshllëqet mund të formohen nga numra të plotë ose thyesa, me vlera ekstreme (në këtë shembull 1 dhe 10).

Një lloj tjetër kushti shënohet me fjalën kyçe is dhe ju lejon të kontrolloni llojin e argumentit. Për shembull, mund të kontrolloni se cilit prej disa llojeve i përket një vlerë x si më poshtë:

kur(x) ( është String => println ("String") është Int => println ("Int") është Array => println ("Array of Double") )

Sistemi i tipit

Lidhje null. Sistemi i tipit të gjuhës Kotlin bën të mundur sigurimin që programet të jenë pa lloje të caktuara gabimesh, të tilla si ridrejtimi i referencës null. Llojet në Kotlin ndahen në që përmbajnë i pavlefshëm dhe që nuk përmban i pavlefshëm. Llojet që përmbajnë i pavlefshëm, e shënuar me një pikëpyetje:

argëtimështë Bosh(s: Vargu?): Boolean (...)

Një pikëpyetje pas emrit të tipit (String) do të thotë që referenca s tregon një objekt të klasës String ose çështje i pavlefshëm . Rezultati i funksionit isEmpty, nga ana tjetër, duhet të jetë një vlerë boolean dhe nuk mund të ketë një vlerë i pavlefshëm, sepse tipi përkatës nuk shënohet me pikëpyetje.

kthimi s.length() == 0 // Gabim: mosreferencimi i referencës null

Ju duhet të kontrolloni në mënyrë eksplicite nëse s i referohet një objekti ekzistues:

I f ( s != i pavlefshëm) { kthimi s.length() == 0 // s saktësisht i referohet një objekti ekzistues) tjetër{ kthehu i vërtetë} kthimi(s == i pavlefshëm) || s.length() == 0//Operator||ofron verifikimin

Shpesh ka zinxhirë të gjatë telefonatash, secila prej të cilave mund të kthehet i pavlefshëm. Rezultati janë disa kushte të mbivendosura që kontrollojnë se çfarë ktheu çdo thirrje në zinxhir. Për të shmangur rrëmujën e kodit, Kotlin mbështet operatorin thirrje e sigurt, e shënuar me "?.":

A?.getB()?.getC()?.getD()

Nëse a nuk është e barabartë i pavlefshëm, shprehja a?.getB() kthen a.getB(), përndryshe - i pavlefshëm.

Hedhje e tipit automatik. Ne dhamë një shembull se si përpiluesi merr parasysh informacionin që përmban kushtet dhe lejon që referencat që tashmë janë kontrolluar të çreferencohen. Një mekanizëm i ngjashëm fut automatikisht një operacion kallëpe të tipit, nëse gjendja përkatëse është kontrolluar më herët në program. Operatori i kontrollit të tipit (i ngjashëm me shembull i në Java) në Kotlin quhet është:

val x: Objekti = ... nëse(x është varg) ( print(x.length()))

Ky shembull teston referencën x për të parë nëse është një varg dhe nëse testi është i suksesshëm, gjatësia e vargut printohet. Kur thirret length(), kompajleri fut automatikisht një cast prej x në String sepse është i sigurt në atë pikë të programit.

Hedhja e tipit automatik punon për të gjitha kushtet: nëse, kur, derisa, ||, && etj.

Funksionet e rendit më të lartë

Përdoruesit e gjuhëve funksionale të programimit janë të njohur me funksionet e rendit më të lartë: një mekanizëm që ju lejon të kaloni funksione si argumente në funksione të tjera, të shkruani funksione në variabla, etj. Siç u përmend tashmë, ky mekanizëm thjeshton shumë krijimin e bibliotekave. Në gjuhët e orientuara nga objekti, funksionet e rendit më të lartë janë zakonisht emuluar duke përdorur modelin e Strategjisë. Për shembull, për të zbatuar filtrimin për koleksionet e një lloji arbitrar, është e nevojshme të parametrizohet funksioni filter() me një objekt që mund t'i përgjigjet pyetjes nëse një element i caktuar duhet të përfshihet në koleksionin që rezulton. Ky objekt është strategjia e filtrimit. Në një gjuhë funksionale, nuk keni nevojë të krijoni një strategji - thjesht mund të kaloni një funksion.

Duke qenë një gjuhë e orientuar nga objekti, Kotlin megjithatë mbështet funksione të rendit më të lartë. Kjo do të thotë para së gjithash që një funksion në Kotlin mund të jetë kuptimi, që ka llojin përkatës:

val kallëzues: argëtim(x: Int): Boolean =...

Në këtë shembull, ndryshorja kallëzues ka lloji funksional « argëtim(x: Int): Boolean", që do të thotë se vlera që ruan është një funksion që merr një parametër numër të plotë dhe kthen një vlerë Boolean. Konkretisht, ne mund ta quajmë këtë funksion:

val poOrJo = kallëzues (1)

Një funksion i tillë mund të përdoret, për shembull, kur filtroni një grup numrash të plotë:

argëtim Koleksioni .intFilter(kallëzues: argëtim(x: Int): Boolean): Koleksion (...)

Dhe për koleksionet arbitrare mund ta përgjithësoni duke përdorur parametra të përgjithshëm:

argëtim Koleksioni .filter(kallëzues: argëtim(x: T) : Boolean) : Koleksion ( val rezultat = ArrayList() për(x në këtë) nëse (kallëzuesi (x)) rezulton.add(x) kthimi rezultat)

(Ky është thjesht një zbatim naiv i funksionit të filtrit(). Një zbatim më real do të kërkonte vlerësim dembel, por kjo është përtej qëllimit të këtij artikulli.)

Gjëja më interesante është se si të vendosni vlerën e një argumenti që ka një tip funksional. Për këtë, të përmendura tashmë Funksioni i fjalëpërfjalshëm:

Ints.filter((x => x % 2 == 0))

Në këtë shembull, argumenti për filtrin e funksionit të jashtëm () është një funksion literal, domethënë një deklaratë e shkurtër e funksionit. Duhet të mbyllet në kllapa kaçurrelë, përpara simbolit "=>" ka deklarata të parametrave, dhe pas - trupi i funksionit, dhe deklarata e kthimit nuk kërkohet, pasi rezultati konsiderohet shprehja e fundit në trupin e fjalëpërfjalës. Pra nga koleksioni do të zgjidhen ints vetëm numra çift, meqenëse literali ynë kthehet i vërtetë vetëm nëse pjesa e mbetur e x e pjesëtuar me 2 është zero.

Në shembullin e mësipërm, lloji i parametrit literal të funksionit nuk është specifikuar sepse përpiluesi automatikisht do ta konkludojë atë jashtë kontekstit. Nëse është e nevojshme, llojet mund të specifikohen, por në shumicën e rasteve një shënim kaq i shkurtër është i mundur dhe ju lejon ta bëni kodin shumë më të lexueshëm.

Për lehtësinë e përdorimit të literaleve të funksionit në Kotlin, miratohen konventat sintaksore të mëposhtme. Së pari, nëse një funksion literal ka saktësisht një parametër, ai parametër nuk ka nevojë të deklarohet dhe emërtohet automatikisht (dhe lloji i tij konkludohet nga konteksti):

Ints.filter((it % 2 == 0)) // Thirrni ngjashëm me shembullin e mëparshëm

Së dyti, nëse argumenti i fundit për një thirrje funksioni është një funksion literal, ai mund të kalohet jashtë kllapave, dhe nëse nuk ka argumente të tjera, atëherë vetë kllapat mund të hiqen:

Ints.filter (it % 2 == 0) // Thirrni ngjashëm me dy shembujt e mëparshëm

Kjo sintaksë ju lejon të shkruani transformimet e koleksionit në një stil që të kujton LINQ:

Ints.select(it * it). ku (it % 2 == 0) // Ndër katrorët e elementeve të grumbullimit // zgjidhni çiftet

(Këtu funksioni Where() bën të njëjtën gjë si funksioni filter().)

Përveç kësaj, kjo konventë i bën thirrjet e funksioneve më të ngjashme me konstruktet e njohura të kontrollit. Le të japim një shembull tjetër. Funksioni i sinkronizuar () merr dy parametra: një objekt sinkronizimi (monitor) dhe një funksion. Gjatë ekzekutimit, monitori kapet fillimisht, pastaj në bllok provoni..më në fund Funksioni ekzekutohet dhe më pas monitori lëshohet:

argëtim i sinkronizuar (l: Kyçja, trupi: argëtim() : T) : T (l.lock() provoni{ kthimi trupi ()) më në fund(l.zhblloko()))

Për të thirrur një fragment kodi të sinkronizuar duke përdorur këtë funksion, thjesht shkruani:

Sinkronizuar (myLock) ( // Kodi që do të ekzekutohet)

Ky shembull tregon se si në Kotlin mund të përdorni gjuhën për të shprehur një konstrukt që është i integruar në Java.

Gjuhë specifike për domenin

Në hyrje, përmendëm bibliotekat, puna me të cilat të kujton përdorimin e gjuhëve specifike të domenit, domethënë gjuhët "të vogla", sikur të ishin ndërtuar në Kotlin. Një shembull do të ishte një bibliotekë për përshkrim modulet, pra njësitë hartuese që përdoren në gjuhën tonë. Moduli është përshkruar skenar montimi- një program Kotlin që thërret funksionet standarde të bibliotekës; ky skript ekzekutohet në kohën e kompilimit. Le të shohim një shembull të një skripti ndërtimi:

val homeDir = "..." module("org.jetbrains.test") ( // Deklarimi i modulit varet(MavenRepo(" [email i mbrojtur]")) // Varësia importNamespace("java.lang") // Importimi i parazgjedhur importNamespace("org.junit") // Importimi i parazgjedhur sourceRoot("$homeDir/src") // Rruga drejt skedarëve burimor testSourceRoot(" $homeDir /teste") // Rruga drejt testeve )

Përkundër faktit se ky është një program i zakonshëm Kotlin, duket si një program në një gjuhë të specializuar të krijuar për përshkrimin deklarativ të moduleve. Kjo qasje për përshkrimin e strukturave të të dhënave është shumë e popullarizuar në Groovy dhe gjuhë të tjera dinamike, pasi shmang përshkruesit e rëndë dhe të vështirë për t'u lexuar të shkruar në XML. Në Groovy, kjo qasje njihet si Ndërtuesit. Një shembull i mrekullueshëm i përdorimit të tij është biblioteka Gradle.

Krahasuar me Groovy dhe gjuhët e tjera dinamike, një ndryshim i rëndësishëm midis DSL-ve të brendshme të Kotlin është se, duke ruajtur të njëjtën shkurtësi të sintaksës, sistemi i tipit garanci statike korrektësinë e programit.

Le të shohim parimin e zbatimit të Ndërtuesve të shtypur statikisht në Kotlin. Për këto qëllime, mjafton një fragment i vogël i gjuhës së skriptit të montimit: një përshkrim i varësive midis moduleve në rastin më të thjeshtë. Pra, vetë modulet përshkruhen nga klasat e mëposhtme:

// Moduli abstrakt klasë abstrakte Moduli (emri: String) ( val varësitë: List = ArrayList() ) // Modul i përbërë nga klasa të shkruara në Kotlin klasës KotlinModule(emri: String) : Moduli(emri) ( argëtim varësia(moduli: Moduli) ( varësitë.add(moduli) ) ) // Moduli i bazuar në depon e Maven klasës MavenRepo (emri: String) : Moduli (emri) (...)

Le të përcaktojmë një funksion module() që krijon një modul të ri:

argëtim moduli (emri: String, init: argëtim KotlinModule.() : Njësia) : KotlinModule ( val rezultat = KotlinModule(emri) result.init() kthimi rezultat)

Ky funksion është një funksion i rendit më të lartë, pasi parametri init është në vetvete një funksion, dhe e jashtme funksioni: Kjo tregohet nga lloji KotlinModule i specifikuar përpara listës së parametrave (bosh) në llojin e funksionit. Kjo do të thotë që funksioni i modulit () mund të quhet kështu:

Moduli ("org.jetbrains.test") ( // init trupin e funksionit)

Ky është i ngjashëm me shembullin e skenarit që kemi parë tashmë. Vini re se ekziston një parametër i nënkuptuar i disponueshëm brenda një funksioni literal kjo shkruani KotlinModule (pasi ky literal është i tipit "funksion i jashtëm") dhe ne mund ta përdorim atë:

Moduli ("org.jetbrains.test") ( kjo.varësia(MavenRepo(" [email i mbrojtur]")) kjo.varësia(modul tjetër) // ... )

Mbetet të theksohet se kjo, si zakonisht, mund të hiqet dhe marrim saktësisht të njëjtën sintaksë si në shembullin e skenarit të dhënë në fillim të këtij seksioni:

Moduli (“org.jetbrains.test”) ( varësia(MavenRepo(" [email i mbrojtur]")) varësia (një modul tjetër) // ... )

Shumë gjuhë deklarative, duke përfshirë gjuhët e shënjimit të tilla si HTML, mund të zbatohen në një mënyrë të ngjashme. Në këtë rast, në vend të etiketave, do të përdoren thirrje për funksione të rendit më të lartë, dhe përdorimi i saktë i këtyre "etiketave", si dhe atributeve të tyre, do të garantohet nga sistemi i tipit:

Html ( head (titulli (+"Enkodimi XML me Kotlin") ) body ( h1 (+"Enkodimi XML me Kotlin") p ( +"Ky është një tekst. Për më shumë shihni" a(href = "http:// jetbrains.com/kotlin") (+"Faqja kryesore e Kotlin") )

Ne shikuam disa nga veçoritë më interesante të gjuhës Kotlin, por lamë jashtë veçori të tilla gjuhësore si llojet gjenerike, funksionet inline, përfaqësimi i llojeve në kohëzgjatjeje (lloji i rifiksuar), mbështetja e delegimit, mbivendosja e operatorit, etj. Rreth këtyre mundësive, si si dhe ecuria e punës në projekt, mund të lexohet në faqen e projektit.

Gjuha është një punë në progres dhe ndërsa specifikimi nuk është vendosur në gurë, ne po bëjmë çdo përpjekje për të marrë dhe përfshirë mendimet e përdoruesve tanë të ardhshëm.

Letërsia

  1. Bloch J. Java efektive. Edicioni i dyte. - Prentice Hall, 2008.
  2. Gamma E., Helm R., Johnson R., Vlissides J. Teknikat e projektimit të orientuara nga objekti. Modelet e projektimit. - Shën Petersburg: Peter, 2007.
  3. Gjuha dhe platforma e programimit Troelsen E. C# 2008. NET 3.5. - M.: Williams, 2010.

Me përjashtim të rasteve të përpilimit të veçantë jokonsistent. - shënim autor.

Operacioni është gjithashtu ju lejon të përputhje modeli(përputhja e modelit) - Përafërsisht. autor.

Andrey Breslav ([email i mbrojtur]) - zhvilluesi kryesor i gjuhës Kotlin, kompania JetBrains.



Në vitin 2010, një grup zhvilluesish nga dega ruse e JetBrains u përpoqën të zhvillonin një gjuhë që do të ishte më e përshtatshme dhe më e sigurt se Java, por jo aq komplekse sa Scala. Emri i kësaj gjuhe u dha për nder të ishullit Kotlin, i vendosur në Gjirin e Finlandës (për analogji me Java, i cili gjithashtu është emëruar pas ishullit).

Nëse shikoni ndonjë përmbledhje moderne të gjuhëve më premtuese të programimit, duke përfshirë , sigurisht që do të gjeni Kotlin atje. Cili është thelbi i kësaj gjuhe, pse të gjithëve u pëlqen kaq shumë, çfarë perspektive ka - më shumë për këtë më vonë.

Sintaksë

Ideja për të krijuar një gjuhë që është po aq e përshtatshme si për fillestarët ashtu edhe për zhvilluesit me përvojë shprehet drejtpërdrejt në sintaksën e saj. Si çdo analog modern, Kotlin është jashtëzakonisht konciz, kompakt dhe i kuptueshëm. Një sasi e madhe kodi që më parë duhej të shkruhej në Java, tani thjesht mund të injorohet. Një shembull i thjeshtë: përdorimi i një pikëpresjeje për të ndarë deklaratat nuk është një kërkesë - përpiluesi tani kupton gjithçka vetë nëse thjesht shkoni në një rresht të ri. Gjatë deklarimit të variablave, në shumë raste nuk është e nevojshme të specifikohet lloji - ai do të përcaktohet automatikisht.

Në të njëjtën kohë, duhet thënë se Kotlin, përsa i përket regjistrimit, i është rikthyer pak stilit Pascal – edhe këtu qartësia mbizotëron mbi qartësinë e strukturave. Ju mund të lexoni pak më shumë rreth kësaj në këtë artikull të shkurtër. Ai mbulon vetëm parimet bazë të ndërtimit të gjuhëve Java dhe Kotlin, kështu që do të jetë e kuptueshme për absolutisht të gjithë.

Megjithatë, ne do të lëmë ende një pjesë të vogël të kodit:

kryesore argëtuese (args: Array ) {
val scope = "botë"
println ("Përshëndetje, $scope!")
}

Një hyrje jashtëzakonisht e thjeshtë që duhet të jetë e kuptueshme për këdo që ka studiuar programim në shkollë ose universitet për të paktën një vit.

Është e rëndësishme të përmendet se Kotlin është plotësisht në përputhje me Java. Kjo është arsyeja pse në fillim u konsiderua si sheqer i thjeshtë sintaksor, i përdorur për detyra komplekse ku thjesht donte të kursente kohë dhe përpjekje.

Përparësitë

Në përgjithësi, të gjitha avantazhet në krahasim me Java janë përmendur tashmë, kështu që ne thjesht do t'i mbledhim ato në një vend:

    Vëllimi i kodit. Mospërdorimi i pjesëve të panevojshme arkaike të kodit përshpejton procesin e zhvillimit dhe rrit lexueshmërinë;

    Siguria. Rregullat për krijimin e kodit të ngulitur në sintaksën e gjuhës ju lejojnë të shmangni gabime të vogla, të vështira për t'u gjurmuar që lindin vetëm gjatë ekzekutimit të programit;

    Pajtueshmëria në Java. Kjo është e përshtatshme si nga pikëpamja e të mësuarit të një gjuhe të re, ashtu edhe nga pikëpamja e transferimit gradualisht të produkteve tuaja softuerike nga Java në Kotlin. Për shembull, kjo është pikërisht ajo që ndodhi me aplikacionin Basecamp.

Të metat

Si një gjuhë që u zhvillua bazuar në Java, Kotlin ka dy disavantazhe të dukshme në krahasim: shpejtësinë dhe përpunimin. Në rastin e parë, gjithçka është e qartë: duke punuar në JVM është e vështirë të mposhtet Java për sa i përket performancës. Problemi i dytë është pak i largët për një gjuhë kaq të re, sepse ka pak më shumë se një vit që është në qarkullim zyrtar. Po, ka shumë më pak mjete dhe biblioteka këtu sesa në Java. Por, së pari, kjo nuk është ende kritike, dhe së dyti, në botën Java, sasia nuk është përkthyer gjithmonë në cilësi.

Kotlin, tani për tani, përballon detyrat e tij kryesore, dhe pajtueshmëria e plotë me Java na ndihmon të mbyllim sytë ndaj këtyre boshllëqeve.

Perspektivat

Përkundër faktit se zhvillimi i Kotlin filloi në 2010, versioni i parë zyrtar u lëshua vetëm në shkurt 2016. Që atëherë, kërkesa për gjuhën është rritur me shpejtësi, në vlerësimin TIOBE ajo u fut në TOP-50 brenda një viti. , dhe muajin e kaluar në konferencën e Google I /O njoftoi mbështetjen zyrtare për Kotlin në sistemin e zhvillimit të aplikacioneve Android.

Duke marrë parasysh popullaritetin e lartë të IntelliJ IDEA midis zhvilluesve dhe fokusin strategjik të kompanisë në Kotlin, mund të themi me besim se në 3-4 vjet do ta shohim atë në mesin e konkurrentëve të plotë të Java dhe Swift në fushën e zhvillimit celular. Përveç kësaj, nëse krijuesit e gjuhës nuk janë të zhgënjyer në produktin e tyre, Kotlin me siguri do të vazhdojë të kapë seriozisht horizonte të tjera: ueb, AI, Interneti i gjërave, të dhëna të mëdha, aplikacione desktop.

Nëse jeni seriozisht të interesuar për këtë gjuhë, atëherë sigurohuni që të hidhni një sy në faqen e saj zyrtare (versioni rus) dhe të përjetoni të gjitha avantazhet e saj nga përvoja personale. Nxitoni përpara se të bëhet e zakonshme.

Ky artikull flet për gjuhën e programimit Kotlin. Do të mësoni për arsyet e shfaqjes së projektit, aftësitë e gjuhës dhe do të shihni disa shembuj. Artikulli u shkrua kryesisht me shpresën që lexuesi të njihet me gjuhën e programimit java, megjithatë, ata që dinë një gjuhë tjetër do të jenë gjithashtu në gjendje të marrin një ide për temën. Artikulli është sipërfaqësor dhe nuk trajton çështje që lidhen me përpilimin në javascript. Dokumentacionin e plotë mund ta gjeni në faqen zyrtare të projektit, por do të përpiqem të flas shkurtimisht për gjuhën.

rreth projektit

Jo shumë kohë më parë, JetBrains, një kompani që krijon mjedise zhvillimi, njoftoi produktin e saj të ri - gjuhën e programimit Kotlin. Një valë kritikash goditi kompaninë: kritikët sugjeruan që kompania të vinte në vete dhe të plotësonte shtojcën për Scala, në vend që të zhvillonte gjuhën e saj. Zhvilluesve të Scala me të vërtetë u mungon një mjedis i mirë zhvillimi, por problemet e zhvilluesve të shtojcave janë të kuptueshme: Scala, e cila lindi falë studiuesve nga Zvicra, ka inkorporuar shumë koncepte dhe qasje shkencore novatore, gjë që e ka bërë krijimin e një mjeti të mirë zhvillimi një detyrë jashtëzakonisht të vështirë. . Për momentin, segmenti i gjuhëve moderne të shtypura statike për JVM është i vogël, kështu që vendimi për të krijuar gjuhën tuaj së bashku me një mjedis zhvillimi për të duket shumë largpamës. Edhe nëse kjo gjuhë nuk zë rrënjë fare në komunitet, JetBrains e bën atë kryesisht për nevojat e saj. Çdo programues Java mund t'i kuptojë këto nevoja: Java si gjuhë po zhvillohet shumë ngadalë, veçoritë e reja nuk po shfaqen në gjuhë (ne kemi pritur për funksione të rendit të parë për disa vite tashmë), përputhshmëria me versionet më të vjetra të gjuhës e bën atë e pamundur që shumë gjëra të dobishme të shfaqen në të ardhmen e afërt (për shembull, parametrizimi i tipit të mirë). Për një kompani që zhvillon softuer, gjuha e programimit është mjeti kryesor i punës, kështu që efikasiteti dhe thjeshtësia e gjuhës janë tregues nga të cilët varet jo vetëm lehtësia e zhvillimit të mjeteve për të, por edhe kostot e kodimit të programuesit, d.m.th sa e lehtë do të jetë të jetë për të ruajtur këtë kod dhe për ta kuptuar atë.

Rreth gjuhës

Gjuha është e shtypur në mënyrë statike. Por në krahasim me java, përpiluesi Kotlin shton informacion në llojin nëse referenca mund të përmbajë null, gjë që shtrëngon kontrollin e tipit dhe e bën ekzekutimin më të sigurt:

Fun foo(tekst:String) ( println(text.toLowerCase()) // NPE? Jo! ) val str:String? = null // Varg? -- Lloji i pavlefshëm foo(str) //<- компилятор не пропустит такой вызов -- // тип str должен быть String, чтобы // передать его в foo

Përkundër faktit se kjo qasje mund ta shpëtojë programuesin nga një sërë problemesh që lidhen me NPE, për një programues Java në fillim duket e panevojshme - duhet të bëni kontrolle ose konvertime të panevojshme. Por pas njëfarë kohe programimi në kotlin, duke u kthyer në java, ju mendoni se ju mungon ky informacion për llojin dhe mendoni të përdorni shënimet Nullable/NotNull. Të lidhura me këtë janë çështjet e përputhshmërisë së prapambetur me java - ky informacion nuk është në bytecode java, por me sa di unë, kjo çështje është ende në proces të zgjidhjes, dhe tani për tani të gjitha llojet që vijnë nga java janë të anulueshme.

Nga rruga, në lidhje me pajtueshmërinë e prapambetur: Kotlin është përpiluar në bytecode JVM (krijuesit e gjuhës shpenzojnë shumë përpjekje për të ruajtur përputhshmërinë), gjë që lejon që ajo të përdoret në të njëjtin projekt me java, dhe aftësinë për të përdorur reciprokisht java dhe klasat Kotlin e bëjnë pragun për futjen e Kotlin në një projekt të madh ekzistues java shumë minimal. Në këtë drejtim, aftësia për të përdorur zhvillime të shumta java duke krijuar një projekt tërësisht në kotlin është e rëndësishme. Për shembull, ishte pothuajse e lehtë për mua të bëja një projekt të vogël të bazuar në pranverë-webmvc.

Le të shohim fragmentin e kontrolluesit:

Klasa e kontrolluesit Path(array("/notes/")) NotesController ( val notes privat me kabllo automatikeShërbimi: NotesService? = shtegu null(array("të gjitha")) argëtim të gjitha() = render("shënime/shënime") ( addObject(" shënime", shënimeShërbimi!!.të gjitha) ) //... )

Veçoritë e përdorimit të shënimeve në Kotlin janë të dukshme: në disa vende nuk duket aq e pastër sa në java (kjo vlen për raste të veçanta, për shembull, një grup prej një elementi), por shënimet mund të përdoren si fjalë kyçe "shtëpi" si p.sh. si automatik ose kontrollues (nëse specifikoni një lloj pseudonimi kur importoni), dhe për sa i përket aftësive, shënimet janë më afër klasave reale.

Duhet të theksohet se Spring nuk ishte në gjendje të mbyllte klasat e Kotlin për të menaxhuar transaksionet - shpresoj se kjo do të jetë e mundur në të ardhmen.

Gjuha ka mbështetje për funksionet e klasit të parë. Kjo do të thotë që një funksion është një lloj i integruar në gjuhë për të cilin ekziston një sintaksë e veçantë. Funksionet mund të krijohen në nivel lokal, të kalohen si parametra në funksione të tjera dhe referencat për to të ruhen:

Fun doSomething(thing:()->Unit) ( // deklaro një parametër të tipit të funksionit // ()-> Njësia nuk pranon asgjë dhe // nuk kthen asgjë të rëndësishme() // thirrje ) doSomething() ( // dhe këtu në fluturim krijojmë një funksion të tipit // ()->Njësi dhe ia kalojmë funksionit doShomething // nëse funksioni është parametri i fundit, mund ta // zhvendosni jashtë kllapave të thirrjes println("Hello world "))

Nëse kësaj shtese i shtojmë funksione që na lejojnë të zgjerojmë një klasë tashmë ekzistuese duke përdorur një metodë që nuk cenon kapsulimin e klasës, por që mund të aksesohet si metoda të kësaj klase, atëherë do të marrim një mekanizëm mjaft të fuqishëm për zgjerimin bibliotekat standarde java që janë mjaft të varfra për sa i përket komoditetit. Sipas traditës, le të shtojmë aftësinë për të filtruar listën që ekziston tashmë në bibliotekën standarde:

Argëtim Listë .filter(kushti:(T)->Boolean):Lista ( val rezultat = lista () for(artikull në këtë) ( if(kushti(artikull)) result.add(artikull) ) kthe rezultat ) val someList = list(1, 2, 3, 4).filter ( it > 2 ) // someList= =

Ju lutemi vini re se variablat nuk kanë lloje të specifikuara - përpiluesi Kotlin i nxjerr ato nëse është e mundur dhe nuk ndërhyn në kuptueshmërinë e ndërfaqes. Në përgjithësi, gjuha është krijuar në atë mënyrë që të shpëtojë sa më shumë që të jetë e mundur personin në tastierë nga shtypja e karaktereve të panevojshme: sintaksë e shkurtër por e qartë me një minimum fjalë kyçe, nuk ka nevojë për pikëpresje për të ndarë shprehjet, shkruani konkluzionet aty ku është e përshtatshme. , asnjë fjalë kyçe e re për të krijuar klasë - vetëm ajo që është e nevojshme.

Për të ilustruar temën e klasave dhe shkurtësinë, le të shohim kodin e mëposhtëm:

// krijimi i klasave bean bëhet // lakonike, fushat mund të deklarohen // direkt në klasën e deklarimit të konstruktorit TimeLord(val emri:String) // klasa mund të mos ketë fare një trup të klasës TARDIS(pronari val:TimeLord) kryesore argëtuese (argumentet: Array ) ( val doktor = TimeLord("Doktor") val tardis = TARDIS(mjek) println(tardis.pronari.emër) )

Në pak rreshta, ne mundëm të deklaronim dy klasa, të krijonim dy objekte dhe të printonim emrin e pronarit të TARDIS! Mund të vërehet se klasa është deklaruar me parametrat e konstruktorit të saj të vetëm të mundshëm, të cilët janë edhe deklarimi i vetive të saj. Jashtëzakonisht i shkurtër, por informues. Me siguri do të ketë nga ata që do të dënojnë pamundësinë e deklarimit të më shumë se një konstruktori, por mua më duket se kjo ka pragmatizmin e vet - në fund të fundit, disa konstruktorë në java ose ju lejojnë të deklaroni parametrat e paracaktuar, të cilat Kotlin i mbështet në gjuhë nivel, ose konvertoni një lloj në një tjetër, me të cilin do të funksionojë kjo klasë, dhe kjo tashmë mund t'i lihet në mënyrë të sigurt metodës së fabrikës. Kushtojini vëmendje deklarimit të "variablave" dhe fushave. Kotlin na detyron të bëjmë një zgjedhje: val ose var. Ku val deklaron një referencë përfundimtare të pandryshueshme, dhe var deklaron një ndryshore, e cila ndihmon në shmangien e përdorimit të gjerë të referencave të ndryshueshme.

Shembull

Tani kemi arritur në vendin ku mund të bëjmë diçka më interesante. Gjatë intervistave, unë shpesh jap detyrën për të zbatuar një pemë, për ta kapërcyer atë dhe për të përcaktuar ndonjë veprim me një element. Le të shohim se si zbatohet kjo në kotlin.

Kështu do të doja të dukej përdorimi:

Kryesor argëtues (args: Array ) ( // krijoni një pemë të vogël val pemë = pemë ("rrënja") ( nyje ("1-1") ( nyje ("2-1") nyje ("2-2") ) nyje ("1-2" " ) ( nyja ("2-3") ) ) // përshkoni atë dhe printoni vlerat në pemën e konsolës.traverse (println(it)))

Tani le të përpiqemi ta zbatojmë këtë. Le të krijojmë një klasë të nyjeve të pemës:

/** * @param vlera e të dhënave të nyjes */ klasa Nyja (vlera val:T) ( // nyja e fëmijëve fëmijët privatë val:Lista > = arrayList() /** * Metoda që krijon dhe shton një fëmijë në një nyje * @param vlerën e vlerës për nyjen e re * Funksioni init @param për të inicializuar nyjen e re, opsional * parametri */ nyja argëtuese(vlera: T, fillimi: Nyja .()->Njësi = ()):Nyja ( nyja val = Nyja (vlera) node.init() children.add(node) return node ) /** * Metoda përshkon në mënyrë rekursive të gjitha nyjet fëmijë duke filluar nga vetë nyja *, secila nyje njoftohet për një mbajtës * @param mbajtës funksioni mbajtës për vlera e secilës nyje */ traverse argëtuese(handler:(T)->Njësi) (trajtues(vlera) fëmijët.forEach (fëmijë -> fëmijë.përshkim(trajtimtar)) )

Tani le të shtojmë një funksion për të krijuar majën e pemës:

/** * Krijon një nyje peme me vlerë vlere dhe inicializon * fëmijët e saj me metodën init. */ argëtim pema (vlera:T, init:Nyja .()->Njësi): Nyja ( nyja val = Nyja(vlera) // thirrja e metodës init të kaluar në parametrin // në nyjen e objektit të nyjës.init() nyja kthyese)

Në dy vende të kodit është përdorur një konstruksion si Node.()->Njësi, kuptimi i tij është se si hyrje pritet një lloj funksioni, i cili do të ekzekutohet si metodë e një objekti të tipit Node. Nga trupi i këtij funksioni ka qasje në metoda të tjera të këtij objekti, siç është metoda Node.node(), e cila ju lejon të bëni inicializimin e pemës të ngjashme me atë të përshkruar në shembull.

Në vend të një përfundimi

Për shkak të pajtueshmërisë së tij të mirë me Java dhe aftësisë për të zëvendësuar gradualisht kodin e vjetër, në të ardhmen Kotlin mund të bëhet një zëvendësim i mirë për java-n në projekte të mëdha dhe një mjet i përshtatshëm për krijimin e projekteve të vogla me perspektivën e zhvillimit të tyre. Thjeshtësia e gjuhës dhe fleksibiliteti i saj i jep zhvilluesit më shumë mundësi për të shkruar kod të shpejtë por me cilësi të lartë.

Nëse jeni të interesuar për gjuhën, të gjitha informacionet rreth gjuhës mund të gjenden në faqen zyrtare të projektit, burimet e tyre mund të gjenden në github dhe çdo gabim i gjetur mund të postohet në gjurmuesin e çështjeve. Ka ende shumë probleme, por zhvilluesit e gjuhës po i luftojnë në mënyrë aktive ato. Tani ekipi është duke punuar në versionin jo shumë të qëndrueshëm të milestone 3, pas stabilizimit, me sa di unë, është planifikuar të përdoret gjuha brenda kompanisë JetBrains, pas së cilës është planifikuar tashmë lëshimi i parë.

Etiketa:

  • kotlin
  • java
  • jet trurit
Shto etiketa

2017 pati një zhurmë të re rreth YP (Gjuha e programimit) Kotlin, dhe në këtë sfond dua t'ju tregoj edhe për risi të tjera në zhvillimin e programeve për telefonat inteligjentë të bazuar në sistemin operativ Android. Por ky është blogu im personal, dhe jo një lloj burimi akademik, dhe për këtë arsye, së pari, do t'i lejoj vetes disa digresione lirike anash, duke e kthyer shikimin tim në të kaluarën.

Ekskursion historik

Njohja ime e parë me programimin e telefonave inteligjentë me sistemin operativ Android ishte në fillim të vitit 2012, pikërisht 6 vite më parë. Në ato kohë të largëta, Google nuk e kishte krijuar ende IDE-në e tij madhështore (Mjedisi i Integruar i Zhvillimit, Mjedisi i Integruar i Zhvillimit) Android Studio dhe unë jemi në Eclipse IDE me shtojcën ADT të instaluar (Mjetet e zhvillimit të Android, Mjetet e zhvilluesve të Android). Arsyeja e njohjes sonë ishte blerja e smartfonit tim të parë, HTC Desire HD, më pak se një vit më parë, në fillim të verës 2011.

Java u konsiderua gjuha amtare e programimit për Android. Ishte një gjuhë e re për mua, kështu që kisha një sfidë të trefishtë: një IDE të re, një gjuhë të re dhe një OS të ri (Sistemi operativ), dhe e gjithë kjo në të njëjtën kohë. Sidoqoftë, disi mësova se si të shkruaj programe për Android, madje shkrova një produkt komercial, për të cilin me kënaqësi mora një stimul prej 1000 €.

Sidoqoftë, programimi për Android ishte jashtëzakonisht i papërshtatshëm, të cilin madje e përmend periodikisht. Këtu është papërsosmëria e IDE, dhe moszhvillimi i bibliotekave standarde në drejtim të Android, dhe atyre, dhe defektet e gjithë kësaj veçmas.

Një vit më vonë në fillim të vitit 2013 Madje fillova të shkruaj një blog të veçantë të quajtur "Android, truket me veshët e tu" me një epigraf karakteristik " Iriqi qanë, injektuan veten, por vazhduan të gërryejnë kaktusin...", në të cilën postoja periodikisht zgjidhje për probleme të caktuara që hasja, si dhe publikoja disa informacione shtesë në sfond, si për kujtesën time.

Në vitin 2014Është shfaqur versioni i parë i qëndrueshëm i IDE nga vetë Google (megjithëse bazuar në IntelliJ IDEA IDE, shkruar në kompaninë legalisht çeke JetBrains, e themeluar në Pragë nga tre programues rusë).

Në përgjithësi, gjithçka filloi me kompaninë ruse StarSoft, e cila filloi aktivitetet e saj menjëherë pas grushtit të shtetit të gushtit 1991 në bazë të laboratorit të softuerit në Akademinë e Pavarur Humanitare në Shën Petersburg, dhe më pas përbëhej nga tre persona. Në vitin 1993 filloi puna për projektin Together (mjet për dizajnimin e softuerit), ideja e së cilës u propozua nga një gjerman i ardhur nga Gjermania. Në 1995, kompania u riemërua STAR SPb dhe u regjistrua zyrtarisht si zyra përfaqësuese ruse e STAR Group. Në vitin 1999, kompania "ruso-gjermane" TogetherSoft, e përbërë nga specialistë që punuan në produktin Together, u shkëput nga STAR SPb. Midis bashkëthemeluesve, si gjithmonë, ishin amerikanë që vendosën se programuesit e mirë duhej të çoheshin urgjentisht nga Shën Petersburg në Evropë, dhe në të njëjtin 1999, ekipi kryesor i TogetherSoft (rreth 50 persona) shkoi në Pragë. Midis tyre ishin tre themeluesit e ardhshëm të JetBrains. Dhe kështu, në vitin 2000, ata themeluan kompaninë JetBrains, dhe u regjistruan në të njëjtin vend ku jetonin në atë kohë, në Pragë.

Produkti kryesor i JetBrains është IntelliJ IDEA, një IDE për shumë gjuhë programimi. Google e mori atë si bazë për IDE Android Studio. Nga rruga, bashkëthemeluesi i Google është gjithashtu nga Rusia. Po të gërmosh pak, rrënjët ruse dalin gjithandej... Ai lindi në Moskë dhe jetoi atje deri në moshën 5-vjeçare dhe më pas familja e tij emigroi në Amerikë në vitin 1979, siç e kishin zakon atëherë hebrenjtë. Për shkak të antisemitizmit, në veçanti, prania e kuotave për hebrenjtë për të hyrë në universitete. Në fillim, hebrenjtë, si popull, izolohen, theksojnë në çdo mënyrë të mundshme zgjedhjen e tyre ndaj Zotit dhe nuk e fshehin mentalitetin e tyre jo gjithmonë të pranueshëm në rajone me një fe tjetër dominuese dhe një mentalitet tjetër, dhe më pas ata habiten me rezultatin. . Megjithatë, kjo është një temë tjetër. Pavarësisht qëndrimit të tij, për ta thënë më butë, skeptik ndaj atdheut të tij të mëparshëm (çfarë tjetër mund të presësh nga një person i rritur nga emigrantët sovjetikë), i ndaj plotësisht pikëpamjet e tij, veçanërisht në internet. Dhe shumë deklarata kritike për Rusinë janë mjaft të drejta, megjithëse të pakëndshme kur dëgjohen nga buzët e një të huaji. Megjithatë, unë u shpërqendrova përsëri ...

Pra, kur u shfaq Android Studio, unë menjëherë kalova në të si një IDE potencialisht më premtuese për zhvillim për Android. Duhet të them që në fillim ishin të dukshme të mirat dhe të këqijat e tij në krahasim me Eclipse. Megjithatë, kishte shumë më tepër avantazhe, dhe unë u lidha fort me të.

Unë si amator nuk programoj rregullisht dhe më ka munguar fare 2017-a për sa i përket Android. Dhe tani vendosa të përditësoj IDE-në dhe të shoh se çfarë gjërash të reja janë shfaqur atje në kohën e ndërmjetme. Dhe doli që shumë gjëra domethënëse u shfaqën atje! Më poshtë do të listoj disa risi veçanërisht të dukshme që i vlerësoj shumë pozitivisht.

Gjuha e re e programimit Kotlin

Deri kohët e fundit, Android Studio mbështeste vetëm programimin në Java (Java, më parë thuhej më shpesh Java. Gjuha është emëruar pas një marke kafeje, e cila, nga ana tjetër, është emëruar pas një ishulli në Indonezi) dhe në C++ për kodin vendas. Gjuha Java nuk është shumë e vjetër, por duke pasur parasysh fokusin relativisht të ri të përdorimit të saj (shumë platformë), mjaft i moshuar. Ai u zhvillua nga kompania e famshme Sun Microsystems në 1995. Gjuha fillimisht quhej Oak ("Lisi"), dhe u zhvillua për programimin e pajisjeve elektronike të konsumit. Më pas u riemërua Java dhe u përdor për të shkruar aplikacionet e klientëve dhe softuerin e serverit. Më vonë u shfaqën përdorime të tjera.

Vërej se Java punon së bashku me një përpilues, i cili nuk prodhon kod të plotë për ekzekutimin e tij në sistemin operativ. Tekstet burimore të shkruara në këtë gjuhë përpilohen në bytekod të veçantë, i cili ekzekutohet në një makinë virtuale të veçantë, të instaluar shtesë në sistem, e cila e përkthen këtë kod në komanda të kuptueshme për sistemin operativ dhe procesorin. Kështu, programet e shkruara në këtë gjuhë mund të ekzekutohen në çdo pajisje në të cilën është instaluar një makinë e tillë virtuale. Dhe makinat virtuale Java janë shkruar tashmë për një sërë arkitekturash. Kështu arrihen programet multiplatformë. Disavantazhi i kësaj qasjeje është rritja e kohës së ekzekutimit për shkak të një shtrese shtesë në formën e një makine virtuale midis kodit dhe procesorit. Gjithashtu, programet Java shpesh funksionojnë më ngadalë për shkak të papërsosmërive të shumë bibliotekave Java, për shembull, bibliotekave GUI. Por e gjithë kjo është çmimi për multiplatformë.

Dhe vetëm kohët e fundit, në fund të 2017, u lëshua Android Studio 3.0, i cili, së bashku me gjuhët Java dhe C++, filloi të mbështesë gjuhën Kotlin (Kotlin), e cila, si Java, është projektuar për të krijuar të njëjtin bajtkod për të njëjtën makinë virtuale, por ka një sintaksë të ndryshme që ju lejon të shkruani kod burimor shumë më kompakt. Në të njëjtën kohë, skedarët burim në të dy gjuhët mund të përzihen pa kufizime në një projekt, gjë që bën të mundur transferimin gradualisht të të gjithë projektit në Kotlin.

Gjuha është krejtësisht e freskët. Filloi të zhvillohet në 2010, u prezantua para publikut në 2011, programimi në të për Android u bë i mundur në 2012, dhe lëshimi zyrtar u lëshua mjaft kohët e fundit, në 2016. Nga rruga, sipas traditës (si Java) gjuha është emëruar sipas ishullit. Këtë herë është ishulli rus Kotlin në Gjirin e Finlandës, në të cilin ndodhet qyteti i Kronstadt. Dhe gjuha u zhvillua nga programuesit e Shën Petersburgut, të gjithë në të njëjtën kompani JetBrains! Oh, si, një gjuhë e vërtetë programimi ruse! [Patriotët duhet të valëvisin flamuj, dhe autori i këtij postimi tashmë po ecën në rrathë nëpër dhomë, duke tundur kërcënueshëm stafin...]

Unë jam përpjekur tashmë të shkruaj në këtë gjuhë për Android dhe mund të them me besim se gjuha është mjaft e përshtatshme. Më parë, unë humba në kodin Java, sepse në Android duhet të shkruash gjithçka dhe të gjithë, dhe përfundove me fletë shumë të gjata të kodit burimor. Si rezultat, kodi burim u rrit në përmasa të turpshme, dhe ato duhej të ndaheshin mirë në klasa, duke i futur në skedarë të ndryshëm, dhe më pas unë isha tashmë i humbur në skedarë. Kotlin përdor filozofinë "çdo gjë që mund të gjenerohet automatikisht duhet të gjenerohet automatikisht". Nga njëra anë, kodi bëhet më pak transparent (minus, por ndoshta vetëm për fillestarët), por më e thjeshtë dhe më kompakte (një plus i madh për të gjithë).

Kompaktësia e kodit arrihet jo vetëm për shkak të strukturave të shkurtuara sintaksore, por edhe për shkak të bibliotekave standarde, metoda e përdorimit të të cilave është përshtatur posaçërisht për kompaktësi dhe përdorim ergonomik. Një shembull i kësaj do të ishin korutinat (ose, si letër gjurmuese nga anglishtja, korutina). Korutinat janë një mënyrë shumë e qartë dhe kompakte e formatimit të kodit që duhet të ekzekutohet në mënyrë asinkrone nga thread-i kryesor. Nuk ka nevojë të shkruani ndonjë klasë shtesë me metoda veç e veç, gjithçka është bërë drejt në kodin kryesor, dhe kjo është e mrekullueshme! Për më tepër, korutinat zbatohen në nivelin e vetë bibliotekës dhe nuk krijojnë fije të sistemit të rëndë. Ata madje quhen fije të lehta. Prandaj, praktikisht nuk ka kufizime në numrin e tyre të lëshuar njëkohësisht. Korutinat janë të pabesueshme!

Komponentët arkitekturorë për Android nga Google

Gjithashtu doli të ishte shumë kompakte krijimi dhe përdorimi i një baze të dhënash SQLite duke përdorur bibliotekën Room, e cila është një mbështjellës mbi klasën e mirënjohur SQLiteOpenHelper. Për të përdorur Room, mjafton të përshkruani dy klasa të vogla që përshkruajnë tabelën dhe bazën e të dhënave dhe një ndërfaqe të vogël që përshkruan funksionet e ndërveprimit me këtë bazë të dhënash. Në Kotlin nuk ka nevojë të vendosni të gjitha këto në skedarë të ndryshëm. Bazuar në këtë informacion të pakët, Room do të riprodhojë të gjitha veprimet që më parë duhej të shkruheshin në skedarë të mëdhenj, automatikisht dhe brenda. Mrekullitë!

Në aplikacionet reale, ju duhet të gjurmoni ndryshimet në të dhënat në bazën e të dhënave dhe të përditësoni automatikisht informacionin në komponentët vizualë. Prandaj, komponenti Room përdoret më shpesh jo më vete, por së bashku me komponentin LiveData nga biblioteka android.arch.lifecycle. Ky komponent është gjithashtu i lehtë për t'u përdorur. Të dhënat që duhen gjurmuar transferohen nga baza e të dhënave në variablin jo drejtpërdrejt, por në formën e klasës LiveData, e cila i ka marrë këto të dhëna si parametër brenda Room. Pas kësaj, në kodin kryesor, një rresht i Kotlin vendos monitorimin e tyre dhe funksionin e përditësimit të komponentit vizual, i cili niset kur të dhënat ndryshojnë. Gjithçka është elementare!

Një tjetër komponent i dobishëm nga biblioteka android.arch.lifecycle që zgjidh dhimbjen e kokës së ruajtjes së të dhënave të aktivitetit gjatë rrotullimit të ekranit është ViewModel. Më parë, ishte e nevojshme të shkruheshin të gjitha llojet e patericave të zgjuara në mënyrë që të dhënat të mos humbeshin dhe llogaritjet të mos ndërpriteshin. Tani ekziston një komponent zyrtar për këtë! Nëse më parë kemi ndarë ndërfaqen nga kodi (shënjimi dhe aktiviteti), atëherë tani është koha për të ndarë kodin që duhet të ekzekutohet vetëm gjatë ciklit jetësor të aktivitetit (për shembull, sigurimi i funksionimit të ndërfaqes së përdoruesit), nga kodi që duhet të ekzekutohet jashtë një cikli jetësor specifik të aktivitetit (për shembull, marrja, përpunimi dhe transmetimi i të dhënave). Në këtë rast, ne mund të lexojmë automatikisht rezultatin e pjesës së dytë të kodit në aktivitetin e rikrijuar pas rrotullimit të ekranit.

Për të zbatuar të gjithë këtë skemë me ViewModel, kërkohet gjithashtu një minimum veprimesh. Një klasë e veçantë shkruhet me kod që nuk duhet të ndërpritet (i ashtuquajturi model i pamjes, nuk e di pse "model"; ndoshta po e përkthej gabim), dhe në kodin kryesor, në një rresht, thirret ofruesi i modelit, të cilit kjo klasë i kalon si parametër. Ofruesi ose kthen një objekt ekzistues të klasës së modelit (pas rrotullimit të ekranit), ose krijon një objekt të tillë duke përdorur klasën e kaluar, nëse nuk ekziston ende, dhe gjithashtu e kthen atë (kur aktiviteti fillon për herë të parë). Një aktivitet mund të aksesojë gjithmonë funksionet dhe variablat e këtij objekti.

Të tre komponentët janë të kombinuar nën emrin zyrtar Android Architecture Components. Vërtetë, ai përfshin gjithashtu komponentin LifeCycle, i vendosur gjithashtu në bibliotekën android.arch.lifecycle, por përdoret në lidhje të ngushtë me LiveData dhe nuk do ta theksoja fare. Futja e komponentëve të tillë të nivelit të lartë është një hap i mirëpritur në drejtimin e duhur për Google. Unë jam ankuar për një kohë të gjatë se sa klasa të ndryshme duhet të zgjeroni veten dhe t'i lidhni të gjitha me njëra-tjetrën për të bërë diçka më shumë se shembuj primitivë nga tekstet fillestare. Dhe më në fund, përbërësit e duhur filluan të shfaqen midis bibliotekave. Shpresoj që ky trend të vazhdojë.

Redaktori i ndërfaqes vizuale

Risitë që zbulova në programimin e smartfonëve nuk mbarojnë me kaq. Që nga lindja e tij, Android Studio pati një kohë shumë të vështirë me stabilitetin dhe parashikueshmërinë e redaktuesit të ndërfaqes vizuale, megjithëse ishte më i qëndrueshëm se në Eclipse. Edhe duke redaktuar drejtpërdrejt shënjimin xml të ndërfaqes, ishte shumë e vështirë të konfigurosh të gjitha këto Layouts dhe komponentë të tjerë vizualë në mënyrë që ato të shfaqen në vendet e duhura dhe në formën e duhur.

Për fat të mirë, në Android Studio, duke filluar nga versioni 2.2, në vend që të ndërtohet një ndërfaqe gimor përmes paraqitjeve të një rregullimi linear të elementeve (Layout linear) propozohet përdorimi i paraqitjes së re të detyruar (ConstraintLayout). Përveç kësaj, redaktori vizual më në fund është finalizuar. E gjithë kjo së bashku pati një efekt shumë pozitiv. Tani nuk është aq e vështirë të pozicionosh saktë elementët, dhe ata sillen në mënyrë mjaft të parashikueshme Tani nuk mund të prekësh as shënimin xml, por të kryesh të gjitha veprimet në redaktuesin vizual.