{"id":29399,"date":"2022-06-29T14:21:01","date_gmt":"2022-06-29T12:21:01","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/kotlin\/"},"modified":"2024-09-30T06:21:28","modified_gmt":"2024-09-30T04:21:28","slug":"kotlin","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/kotlin\/","title":{"rendered":"Wprowadzenie do Kotlina"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\">Przejd\u017a do: <\/p>\n    <ol>\n                    <li><a href=\"#J\u0119zyki-JVM\">1.  J\u0119zyki JVM<\/a><\/li>\n                    <li><a href=\"#Kotlin-vs-Java\">2.  Kotlin vs Java<\/a><\/li>\n                    <li><a href=\"#Co-ma-Kotlin,-czego-nie-ma-Java?\">3.  Co ma Kotlin, czego nie ma Java?<\/a><\/li>\n                    <li><a href=\"#Czego-nie-ma-Kotlin,-a-ma-to-Java?\">4.  Czego nie ma Kotlin, a ma to Java?<\/a><\/li>\n                    <li><a href=\"#Zastosowanie-j\u0119zyka-Kotlin\">5.  Zastosowanie j\u0119zyka Kotlin<\/a><\/li>\n                    <li><a href=\"#Kotlin-Android-Development\">6.  Kotlin Android Development<\/a><\/li>\n                    <li><a href=\"#Programuj\u0119-w-Javie-czy-warto-si\u0119-przestawi\u0107-na-Kotlin?\">7.  Programuj\u0119 w Javie \u2013 czy warto si\u0119 przestawi\u0107 na Kotlin?<\/a><\/li>\n                    <li><a href=\"#Czy-Kotlin-zast\u0105pi-Jav\u0119?\">8.  Czy Kotlin zast\u0105pi Jav\u0119?<\/a><\/li>\n                    <li><a href=\"#Podsumowanie\">9.  Podsumowanie<\/a><\/li>\n                    <li><a href=\"#Sk\u0105d-czerpa\u0107-wiedz\u0119?\">10.  Sk\u0105d czerpa\u0107 wiedz\u0119? <\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"J\u0119zyki-JVM\">J\u0119zyki JVM<\/h2>\n\n\n\n<p><strong>\u201eNapisz raz, uruchamiaj wsz\u0119dzie\u201d<\/strong> \u2013 taka idea inspirowa\u0142a tw\u00f3rc\u00f3w Javy. Aby to osi\u0105gn\u0105\u0107, potrzebowali czego\u015b, co uniezale\u017cnia\u0142oby kod aplikacji od konkretnej platformy sprz\u0119towej. Stworzyli wi\u0119c wirtualn\u0105 maszyn\u0119 Javy (JVM), kt\u00f3ra interpretuje kod bajtowy niezale\u017cnie od urz\u0105dzenia, na kt\u00f3rym jest zainstalowana. Z czasem powsta\u0142o wi\u0119cej j\u0119zyk\u00f3w, kt\u00f3re kompilowane s\u0105 do tego samego kodu po\u015bredniego i mog\u0105 by\u0107 uruchamiane poprzez JVM. W\u015br\u00f3d nich pojawi\u0142y si\u0119 mi\u0119dzy innymi <strong>Groovy, Scala oraz Kotlin.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Kotlin-vs-Java\">Kotlin vs Java<\/h2>\n\n\n\n<p>O Kotlinie cz\u0119sto m\u00f3wi si\u0119, \u017ce jest nast\u0119pc\u0105 Javy. J\u0119zyk ten wprowadza pewne u\u0142atwienia, kt\u00f3re sprawiaj\u0105, \u017ce kod jest bardziej zwi\u0119z\u0142y i przejrzysty. Mechanizmy, kt\u00f3re Kotlin oferuje, mog\u0105 sprawi\u0107, \u017ce praca programisty b\u0119dzie efektywniejsza, a kod bardziej odporny na b\u0142\u0119dy. Ponadto j\u0119zyk ten oferuje interoperacyjno\u015b\u0107 z Jav\u0105. &nbsp;Oznacza to, \u017ce mamy mo\u017cliwo\u015b\u0107 u\u017cycia obu j\u0119zyk\u00f3w w tworzonym przez nas projekcie, jak i korzystania z bibliotek i framework\u00f3w znanych z Javy.<\/p>\n\n\n\n<p><strong>Chcia\u0142bym zwr\u00f3ci\u0107 uwag\u0119 na niekt\u00f3re z r\u00f3\u017cnic pomi\u0119dzy Jav\u0105 a Kotlinem.<\/strong><\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/jpro_2022.06.29_graphic_2.png\" alt=\"Kotlin vs Java \u2013 por\u00f3wnanie obu j\u0119zyk\u00f3w programowania\" class=\"wp-image-66819\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Co-ma-Kotlin,-czego-nie-ma-Java?\">Co ma Kotlin, czego nie ma Java? \u2013 przyk\u0142ady<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Obs\u0142uga typ\u00f3w nie pustych (ang. non-nullable types)<\/h3>\n\n\n\n<p>W Kotlinie rozr\u00f3\u017cniane s\u0105 typy, kt\u00f3re mog\u0105 przyjmowa\u0107 warto\u015bci puste lub nie. Aby zmienna mog\u0142a przyj\u0105\u0107 warto\u015b\u0107 \u201enull\u201d, musimy j\u0105 oznaczy\u0107, dodaj\u0105c znak \u201e?\u201d, tak jak w poni\u017cszym przyk\u0142adzie.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.\tval a: String? = null<\/pre>\n\n\n\n<p>Mechanizm ten pozwala na unikni\u0119cie wielu b\u0142\u0119d\u00f3w typu \u201eNullPointerException\u201d, kt\u00f3re spowodowane s\u0105 odwo\u0142aniem si\u0119 do pola nieistniej\u0105cego obiektu. Ju\u017c na poziomie kompilacji programista zostanie poinformowany, \u017ce co\u015b jest nie tak.<\/p>\n\n\n\n<p>Istnieje jeszcze operator \u201e!!\u201d, kt\u00f3ry konwertuje dowoln\u0105 warto\u015b\u0107 na typ nieakceptuj\u0105cy warto\u015bci pustych. Je\u017celi wykorzystamy ten mechanizm, musimy si\u0119 liczy\u0107 z mo\u017cliwo\u015bci\u0105 wyst\u0105pienia \u201eNullPointerException\u201d. Ten operator powinien by\u0107 stosowany bardzo ostro\u017cnie, tylko wtedy, gdy jest si\u0119 przekonanym, \u017ce warto\u015bci nie b\u0119d\u0105 puste w momencie ich u\u017cycia.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.   val a: String? = null \n\n2.   println(a!!.length)    \/\/ NullPointerException <\/pre>\n\n\n\n<p>Gdy nie jeste\u015bmy pewni, czy mo\u017cemy odwo\u0142a\u0107 si\u0119 do danego pola, z pomoc\u0105 przychodzi nam operator bezpiecznego wywo\u0142ania (ang.<em> safe call operator<\/em>) \u201e?.\u201d, kt\u00f3ry sprawdza, czy referencja ma warto\u015b\u0107 pust\u0105 bez wyrzucania wyj\u0105tku \u201eNullPointerException\u201d. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.   val a: String? = \"Kotlin\" \n\n2.   val b: String? = null \n\n3.   println(a?.length)  \/\/ 6 \n\n4.   println(b?.length) \/\/ null <\/pre>\n\n\n\n<p>Java wraz z nadej\u015bciem wersji 8 otrzyma\u0142a mechanizm pozwalaj\u0105cy wyrazi\u0107 potencjalny brak warto\u015bci. Dodana zosta\u0142a klasa \u201eOptional\u201d, kt\u00f3ra wzbogaca zmienn\u0105, na kt\u00f3rej pracujemy, o dodatkowe metody pozwalaj\u0105ce obs\u0142u\u017cy\u0107 brak zasobu. Jednak\u017ce Kotlin radzi sobie z tym problemem w spos\u00f3b generalnie bardziej zwi\u0119z\u0142y. U\u017cycie operator\u00f3w wymaga mniej kodu ni\u017c odwo\u0142ywanie si\u0119 do warto\u015bci opakowanej w dodatkow\u0105 klas\u0119.&nbsp;<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/jpro_2022.06.29_graphic_1.png\" alt=\"Zalety j\u0119zyka Kotlin - odporno\u015b\u0107 na b\u0142\u0119dy\" class=\"wp-image-66829\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Domniemanie typ\u00f3w<\/h2>\n\n\n\n<p>W Kotlinie, inaczej ni\u017c w Javie, typ w wielu przypadkach jest okre\u015blany automatycznie na podstawie kontekstu (mo\u017cemy pomin\u0105\u0107 deklaracj\u0119 typu). Ilustruje to poni\u017cszy przyk\u0142ad, w kt\u00f3rym zmiennej \u201ea\u201d zostanie przydzielony typ \u201eint\u201d.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.   var a = 1 \n\n2.   a = 5 <\/pre>\n\n\n\n<p>Podczas deklaracji zmiennych mamy do dyspozycji dwa s\u0142owa kluczowe \u201evar\u201d i \u201eval\u201d. U\u017cycie pierwszego z nich (\u201evar\u201d) powoduje to, \u017ce warto\u015b\u0107 b\u0119dzie mog\u0142a zosta\u0107 zmieniona. Natomiast pole zadeklarowane z \u201eval\u201d nie b\u0119dzie mog\u0142o ulec modyfikacji. Zatem kod:<strong><\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.   val a = 1 \n\n2.   a = 5 \/\/ b\u0142\u0105d <\/pre>\n\n\n\n<p>zostanie potraktowany jako b\u0142\u0105d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Inteligentne rzutowanie (ang. <em>smart casts<\/em>)<strong><\/strong><\/h3>\n\n\n\n<p>Kompilator Kotlina jest w stanie samodzielnie zapami\u0119ta\u0107 sprawdzenie typu i odpowiednio rzutowa\u0107 zmienn\u0105 na dany typ. W ten spos\u00f3b w wi\u0119kszo\u015bci przypadk\u00f3w mo\u017cna automatycznie u\u017cywa\u0107 zmiennych zgodnie z potrzebami, bez konieczno\u015bci r\u0119cznego wykonywania oczywistych rzutowa\u0144.<\/p>\n\n\n\n<p>Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.  fun printStringLength(any:Any) { \n\n2.  if(any is String) { \n\n3.    println(any.length) \n\n4.  } \n\n5. }  <\/pre>\n\n\n\n<p>Zmienna \u201eany\u201d jest automatycznie rzutowana na typ String.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Funkcje rozszerzaj\u0105ce (ang. <em>extension functions<\/em>)<\/h3>\n\n\n\n<p>Zdarza si\u0119, \u017ce jaka\u015b klasa (np. z biblioteki) nie posiada metod, kt\u00f3re mog\u0142yby by\u0107 dla nas bardzo przydatne. Funkcje rozszerzaj\u0105ce pozwalaj\u0105 w \u0142atwy spos\u00f3b rozszerzy\u0107 dan\u0105 klas\u0119 o now\u0105 funkcjonalno\u015b\u0107. Takie rozwi\u0105zanie pozwala nam po prostu na dodanie nowej funkcji do danej klasy.&nbsp;<\/p>\n\n\n\n<p>Przyk\u0142ad: <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1. fun Activity.showToast(message:String){ \n\n2.   Toast.makeText(this, message, Toast.LENGTH_LONG).show() \n\n3. }\u202f <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Warto\u015bci domy\u015blne<\/h3>\n\n\n\n<p>Kotlin oferuje tak\u017ce wsparcie dla warto\u015bci domy\u015blnych. Definiuj\u0105c funkcj\u0119, mo\u017cemy ustawi\u0107 domy\u015blny parametr, kt\u00f3rego nie trzeba ju\u017c b\u0119dzie podawa\u0107 w wywo\u0142aniu funkcji.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.   fun sayHello(name: String = \u201eWorld\u201d){ \n\n2.   \tprintln(\u201eHello $name\u201d) \n\n3.   } \n\n \n\n1.    sayHello()    \/\/ Hello World <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u201eData classes\u201d<\/h3>\n\n\n\n<p>To klasy, kt\u00f3re s\u0105 tylko kontenerem na dane. Domy\u015blnie implementuj\u0105 metody takie jak <em>equals(), hashCode()<\/em>, <em>toString(), <\/em>kt\u00f3re w Javie nale\u017ca\u0142oby samodzielnie zaimplementowa\u0107.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.   data class User(val name: String, val age: Int)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Brak getter\u00f3w i setter\u00f3w<\/h3>\n\n\n\n<p>W Kotlinie gettery i settery s\u0105 generowane automatycznie. Pozwala to na zaoszcz\u0119dzenie wielu linii kodu i czasu po\u015bwi\u0119conego na ich pisanie.&nbsp;<\/p>\n\n\n\n<p>Oczywi\u015bcie w Javie r\u00f3wnie\u017c powsta\u0142y narz\u0119dzia, kt\u00f3re pozwalaj\u0105 zredukowa\u0107 powtarzalny kod. \u201eLombok\u201d jest bibliotek\u0105, kt\u00f3ra na podstawie adnotacji automatycznie generuje kod w celu ograniczenia tzw. \u201eboilerplate code\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czego-nie-ma-Kotlin,-a-ma-to-Java?\">Czego nie ma Kotlin, a ma to Java?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Typy prymitywne<\/h3>\n\n\n\n<p>Podstawowe typy danych takie, jak: boolean, byte, short, int, long, float, double, char. Nie przechowuj\u0105 one obiekt\u00f3w, lecz pojedyncze warto\u015bci. A operacje na nich s\u0105 szybsze ni\u017c w przypadku typ\u00f3w z\u0142o\u017conych.<\/p>\n\n\n<div class=\"special-content-box style-1\">\r\n    <div class=\"box\">\r\n                <div class=\"content\">\r\n                                <\/div>\r\n    <\/div>\r\n<\/div>\r\n\n\n\n<h3 class=\"wp-block-heading\">\u201eChecked exceptions\u201d<\/h3>\n\n\n\n<p>Wyj\u0105tki, kt\u00f3re musz\u0105 by\u0107 obs\u0142u\u017cone przez programist\u0119. \u017beby skompilowa\u0107 kod, programista musi \u201enaprawi\u0107\u201d b\u0142\u0105d wyrzucony przez wywo\u0142an\u0105 funkcj\u0119 (u\u017cy\u0107 <strong>instrukcji try\u2026catch\u2026).<\/strong><\/p>\n\n\n\n<p>Jest to kontrowersyjny koncept. Niekt\u00f3rzy uwa\u017caj\u0105, \u017ce nie poprawia to jako\u015bci kodu, a zmniejsza produktywno\u015b\u0107 programisty. Narzucenie konieczno\u015bci obs\u0142ugi wyj\u0105tk\u00f3w czasami skutkuje pustymi blokami \u201ecatch\u201d. Obs\u0142uga wyj\u0105tk\u00f3w np. typu \u201eIOException\u201d w niskopoziomowej metodzie nie zawsze ma sens. By\u0107 mo\u017ce lepiej by\u0142oby obs\u0142u\u017cy\u0107 je gdzie\u015b na wy\u017cszym poziomie. Kotlin \u015bwiadomie nie przyj\u0105\u0142 tego konceptu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">S\u0142owo kluczowe \u201estatic\u201d<\/h3>\n\n\n\n<p>Kotlin nie posiada s\u0142owa kluczowego \u201estatic\u201d. Zamiast tego ma mechanizmy takie jak \u201ecompanion object\u201d, czy deklarowanie zmiennej\/funkcji poza klas\u0105 (ang. top-level declaration).<\/p>\n\n\n\n<p>\u201cCompanion object\u201d to obiekt typu \u201csingleton\u201d, powi\u0105zany z klas\u0105, w kt\u00f3rej si\u0119 znajduje, i zawieraj\u0105cy pola i metody, do kt\u00f3rych mo\u017cemy si\u0119 odwo\u0142a\u0107 w ten sam spos\u00f3b co do element\u00f3w statycznych w Javie. <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">1.   class MyClass { \n\n2.       companion object Factory { \n\n3.           fun create(): MyClass = MyClass() \n\n4.       } \n\n5.   } \n\n \n\n1.   val myClass = MyClass.create() \n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Zastosowanie-j\u0119zyka-Kotlin\">Zastosowanie j\u0119zyka Kotlin<\/h2>\n\n\n\n<p>Odk\u0105d w 2019 r. Google og\u0142osi\u0142o Kotlin rekomendowanym j\u0119zykiem dla aplikacji na ich system operacyjny na urz\u0105dzenia mobilne, mo\u017ce by\u0107 on przez wielu developer\u00f3w kojarzony g\u0142\u00f3wnie z Androidem. Jednak warto pami\u0119ta\u0107, \u017ce to niejedyne zastosowanie Kotlina. <\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/nearshore-it.eu\/wp-content\/uploads\/2024\/09\/jpro_2022.06.29_graphic_3.png\" alt=\"J\u0119zyk Kotlin\" class=\"wp-image-66823\" title=\"\"><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>J\u0119zyk ten sprawdza si\u0119 te\u017c w przypadku tworzenia aplikacji serwerowych czy desktopowych. Og\u00f3lnie rzecz ujmuj\u0105c, sprawdzi si\u0119 wsz\u0119dzie tam, gdzie mo\u017ce by\u0107 u\u017cywana Java (z ciekawostek \u2013 Kotlin zosta\u0142 wykorzystany przy tworzeniu zintegrowanego \u015brodowiska developerskiego IntelliJ IDEA)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Projekt Kotlin Multiplatform<\/h3>\n\n\n\n<p>Warto wspomnie\u0107 te\u017c o tym, \u017ce rozwijany jest projekt o nazwie <strong>\u201eKotlin Multiplatform\u201d.<\/strong> Dzi\u0119ki niemu mo\u017cliwe jest pisanie wsp\u00f3lnego kodu logiki biznesowej aplikacji, kt\u00f3ra b\u0119dzie dzia\u0142a\u0107 na wielu platformach, takich jak mi\u0119dzy innymi Android, iOS, Windows, Linux, macOS oraz jako aplikacja webowa.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Kotlin-Android-Development\">Kotlin Android Development<\/h2>\n\n\n\n<p>Kotlin zyska\u0142 ogromn\u0105 popularno\u015b\u0107 dzi\u0119ki Androidowi. Obecnie wi\u0119kszo\u015b\u0107 nowych aplikacji na t\u0119 platform\u0119 powstaje w\u0142a\u015bnie w tym j\u0119zyku. Jedne z najbardziej znanych aplikacji na Androida stworzonych z u\u017cyciem Kotlina to: <strong>Slack, Trello, Evernote, Pinterest, Tinder czy Uber.<\/strong><\/p>\n\n\n\n<p>Tak\u017ce nowe narz\u0119dzia dla Android developer\u00f3w, takie jak np. Jetpack Compose, wykorzystuj\u0105 cechy Kotlina i wymagaj\u0105 jego u\u017cycia. W wielu nowo powstaj\u0105cych tutorialach przyk\u0142adowy kod cz\u0119sto jest r\u00f3wnie\u017c zaprezentowany w tym w\u0142a\u015bnie j\u0119zyku.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Programuj\u0119-w-Javie-czy-warto-si\u0119-przestawi\u0107-na-Kotlin?\">Programuj\u0119 w Javie \u2013 czy warto si\u0119 przestawi\u0107 na Kotlin?<\/h2>\n\n\n\n<p>Nie\u0142atwo jest por\u00f3wnywa\u0107 j\u0119zyki programowania, poniewa\u017c ka\u017cdy ma swoje wady i zalety. Zar\u00f3wno Kotlin, jak i Java ci\u0105gle s\u0105 rozwijane i oferuj\u0105 coraz to nowsze mechanizmy. Java jest z nami od 1991 roku i od wielu lat znajduje si\u0119 w czo\u0142\u00f3wce najpopularniejszych j\u0119zyk\u00f3w programowania na \u015bwiecie. Przez ten czas powsta\u0142o wiele projekt\u00f3w. Czy warto wi\u0119c si\u0119 przestawi\u0107? To zale\u017cy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czy-Kotlin-zast\u0105pi-Jav\u0119?\">Czy Kotlin zast\u0105pi Jav\u0119?<\/h2>\n\n\n\n<p>Cho\u0107 dla tysi\u0119cy programist\u00f3w na \u015bwiecie <strong>kr\u00f3lowa jest tylko jedna,<\/strong> wiele argument\u00f3w wskazuje na to, \u017ce Kotlin to godny nast\u0119pca Javy. Najwa\u017cniejsze z nich to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Czytelniejszy kod<\/li>\n\n\n\n<li>Odporno\u015b\u0107 na b\u0142\u0119dy typu \u201eNullPointerException\u201d<\/li>\n\n\n\n<li>Mechanizmy wspieraj\u0105ce programowanie funkcyjne czy narz\u0119dzia (takie jak np. Jetpack Compose dla Androida)<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Podsumowanie\">Podsumowanie<\/h2>\n\n\n\n<p>Moim zdaniem, rozpoczynaj\u0105c nowy projekt, <strong>warto si\u0119 przestawi\u0107 na j\u0119zyk stworzony przez firm\u0119 JetBrains.<\/strong> Pozostaje jednak jeszcze pytanie, co z istniej\u0105cymi projektami napisanymi w Javie? Czy warto je migrowa\u0107 do Kotlina? Kotlin zosta\u0142 zaprojektowany tak, \u017ceby zachowa\u0107 pe\u0142n\u0105 kompatybilno\u015b\u0107 z Jav\u0105. Migracja mo\u017ce wi\u0119c nast\u0119powa\u0107 w spos\u00f3b stopniowy. W bazie kodu mog\u0105 by\u0107 dwa j\u0119zyki. Wiele firm wykorzystuje ten fakt i przekszta\u0142ca swoje aplikacje, aby mog\u0142y by\u0107 one dalej rozwijane z wykorzystaniem zalet Kotlina. Jednak\u017ce dwa j\u0119zyki w kodzie mog\u0105 powodowa\u0107 pewne zamieszanie. Warto wi\u0119c, jak zawsze, zachowa\u0107 szerszy kontekst i dopasowa\u0107 j\u0119zyk indywidualnie do potrzeb i specyfiki projektu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Sk\u0105d-czerpa\u0107-wiedz\u0119?\">Kotlin \u2013 sk\u0105d czerpa\u0107 wiedz\u0119?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Strony internetowe<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Oficjalna strona Kotlina \u2013 <a href=\"https:\/\/kotlinlang.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/kotlinlang.org\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.w3schools.com\/kotlin\/index.php\" target=\"_blank\" rel=\"noopener\">https:\/\/www.w3schools.com\/kotlin\/index.php<\/a><\/li>\n\n\n\n<li>Kotlin Academy \u2013 <a href=\"https:\/\/blog.kotlin-academy.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/blog.kotlin-academy.com\/<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Ksi\u0105\u017cki:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201eKotlin w Akcji\u201d \u2013 Dmitry Jemerov, Svetlana Isakova<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Materia\u0142y dla programist\u00f3w Android:&nbsp;<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/proandroiddev.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/proandroiddev.com\/<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.android.com\/kotlin\" target=\"_blank\" rel=\"noopener\">https:\/\/developer.android.com\/kotlin<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Kana\u0142y na YouTube:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.youtube.com\/c\/AndroidDevelopers\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/c\/AndroidDevelopers<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.youtube.com\/stevdza_san\" target=\"_blank\" rel=\"noopener\">https:\/\/www.youtube.com\/stevdza_san<\/a><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kotlin jest j\u0119zykiem programowania og\u00f3lnego przeznaczenia stworzonym przez firm\u0119 JetBrains, a jego pierwsza stabilna wersja ukaza\u0142a si\u0119 w 2016 roku. Ten j\u0119zyk \u0142\u0105czy w sobie elementy programowania funkcyjnego, imperatywnego i obiektowego. Czy warto uczy\u0107 si\u0119 programowania w j\u0119zyku Kotlin? Jakie s\u0105 jego zalety i zastosowania? Dlaczego developer programuj\u0105cy w Javie mia\u0142by si\u0119 przestawi\u0107 na ten w\u0142a\u015bnie j\u0119zyk? W jakich projektach warto go wykorzysta\u0107? Sprawd\u017amy!<\/p>\n","protected":false},"author":169,"featured_media":29410,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":315,"footnotes":""},"categories":[1,582],"tags":[568],"offering":[522],"class_list":["post-29399","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-java-pl","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=29399"}],"version-history":[{"count":3,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29399\/revisions"}],"predecessor-version":[{"id":32925,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29399\/revisions\/32925"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/29410"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=29399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=29399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=29399"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=29399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}