{"id":9872,"date":"2021-01-14T14:15:46","date_gmt":"2021-01-14T13:15:46","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=9872"},"modified":"2023-10-24T15:50:12","modified_gmt":"2023-10-24T13:50:12","slug":"java-2-0-czyli-kotlin","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/java-2-0-czyli-kotlin\/","title":{"rendered":"Java 2.0 czyli Kotlin"},"content":{"rendered":"\n<p>O Javie mo\u017cna m\u00f3wi\u0107 w dwojaki spos\u00f3b, albo o jednym z najbardziej popularnych j\u0119zyku programowania na \u015bwiecie, albo o maszynie wirtualnej, kt\u00f3r\u0105 chyba ka\u017cdy z nas kiedy\u015b instalowa\u0142 na swoim komputerze, zwanej te\u017c, cytuj\u0105c stopk\u0119 na stronie <a href=\"https:\/\/www.java.com\/pl\/download\/\" rel=\"nofollow\" >https:\/\/www.java.com\/pl\/download\/<\/a>.<\/p>\n\n\n\n<p><em>&#8222;Java Runtime, Runtime Environment, Runtime, JRE, Java Virtual Machine, maszyna wirtualna Java, Java VM, JVM, VM, wtyczka Java, Java Plug-In, dodatek Java lub Java Download.&#8221;<\/em><\/p>\n\n\n\n<p>J\u0119zyk Java i JVM s\u0105 od siebie niezale\u017cne, chodzi tutaj o to, \u017ce kod napisany w Javie nie jest bezpo\u015brednio uruchamiany na JVM, przed uruchomieniem ten kod jest kompilowany do kodu bajtowego i dopiero wtedy uruchamiany.<\/p>\n\n\n\n<p>I tutaj mamy pewn\u0105 furtk\u0119, kt\u00f3r\u0105 wykorzysta\u0142a firma JetBrains. Doszli oni do bardzo prostego wniosku, \u017ce nie wa\u017cne w czym, wa\u017cne aby wygenerowa\u0107 kod bajtowy, kt\u00f3ry b\u0119dzie wykonywany na JVM. Takie rozwi\u0105zanie ma jeszcze jedn\u0105 bardzo du\u017c\u0105 zalet\u0119. Mianowicie kod napisany w Kotlinie i skompilowany, mo\u017cna bez problemu wykorzysta\u0107 w normalnych projektach pisanych w Javie.<\/p>\n\n\n\n<p>Oczywi\u015bcie nie oby\u0142o si\u0119 bez dodatkowych wtyczek, kompilator\u00f3w itp., kt\u00f3re w pewnym sensie opakowuj\u0105 j\u0119zyk Jav\u0119, ale o tym kiedy indziej.<\/p>\n\n\n\n<p>Wszystko fajnie, ale co z tego? W czym ten Kotlin jest lepszy od zwyk\u0142ej Javy? Przecie\u017c dalej to jest JVM i do tego mo\u017cna jeszcze odnie\u015b\u0107 wra\u017cenie, \u017ce jest wolniejszy, bo przecie\u017c go opakowujemy jakimi\u015b dodatkowymi rzeczami.<\/p>\n\n\n\n<p>Kr\u00f3tka odpowied\u017a: Kotlin jest po prostu Jav\u0105 2.0.<\/p>\n\n\n\n<p>D\u0142u\u017csza odpowied\u017a:<\/p>\n\n\n\n<p>Ka\u017cdy j\u0119zyk da si\u0119 por\u00f3wna\u0107 z innym j\u0119zykiem. Nie mo\u017cna oczywi\u015bcie powiedzie\u0107, C# jest lepszy od Javy, albo C++ jest lepszy od Pythona, a PHP to totalne dno. To tak jakby powiedzie\u0107, \u017ce m\u0142otek jest lepszy od pi\u0142y. Bezsens. Mo\u017cna natomiast por\u00f3wna\u0107 pewne cechy zar\u00f3wno samego j\u0119zyka, jak i ca\u0142ego rozwi\u0105zania albo nawet ekosystemu, no bo czym by\u0142aby Java bez JVM. Cz\u0119\u015b\u0107 tych cech jest subiektywna, a cz\u0119\u015b\u0107 obiektywna i dla ka\u017cdego z nas mog\u0105 mie\u0107 one inny priorytet. Moim zdaniem dwa najwa\u017cniejsze z nich to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Szybko\u015b\u0107 dzia\u0142ania, zasobo\u017cerno\u015b\u0107, zu\u017cycie energii:<\/strong> Wbrew pozorom Java, a jeszcze dok\u0142adniej JVM wcale nie jest taki wolny na jakiego wygl\u0105da, nie jest to oczywi\u015bcie assembler, C czy C++ ale dzi\u0119ki wielu r\u00f3\u017cnego rodzaju sztuczkom w JVM-ie jest on przyzwoicie szybki. Na potwierdzenie tych s\u0142\u00f3w mo\u017cna zerkn\u0105\u0107 na benchmarki, Java wypada w nich naprawd\u0119 przyzwoicie <a href=\"https:\/\/attractivechaos.github.io\/plb\/\" rel=\"nofollow\" >https:\/\/attractivechaos.github.io\/plb\/<\/a>. Podobnie jest z energi\u0105, natomiast z zasobami ju\u017c jest troch\u0119 gorzej. Wi\u0119cej na ten temat mo\u017cna przeczyta\u0107 tutaj:<a href=\"https:\/\/thenewstack.io\/which-programming-languages-use-the-least-electricity\/\" rel=\"nofollow\" > https:\/\/thenewstack.io\/which-programming-languages-use-the-least-electricity\/<\/a>. Kotlin wypada w por\u00f3wnaniu do Javy troch\u0119 gorzej, ale s\u0105 to warto\u015bci naprawd\u0119 ma\u0142e.<\/li>\n\n\n\n<li><strong>Jak szybko mo\u017cna pisa\u0107 kod:<\/strong> To jest do\u015b\u0107 subiektywne, poniewa\u017c ka\u017cdy z nas koduje w r\u00f3\u017cnym tempie, ale z do\u015bwiadczenia mog\u0119 powiedzie\u0107, \u017ce Kotlin jest o wiele \u0142atwiejszy zar\u00f3wno do nauczenia si\u0119, jak i wykorzystania, a wynika to z prostego faktu, j\u0119zyk ten jest pragmatyczny. Zosta\u0142 napisany przez programist\u00f3w z wieloletnim do\u015bwiadczeniem, aby w \u0142atwy spos\u00f3b rozwi\u0105zywa\u0107 ich problemy. Zawiera o wiele wy\u017cszy poziom abstrakcji oraz sk\u0142ada si\u0119 z element\u00f3w, kt\u00f3re s\u0105 po prostu sprawdzone.<\/li>\n<\/ul>\n\n\n\n<p>Dodatkowo mo\u017cna tutaj por\u00f3wna\u0107 jeszcze takie rzeczy jak: wsparcie \u015brodowiska (Java oczywi\u015bcie tutaj wygrywa, ale Kotlin te\u017c ma si\u0119 ca\u0142kiem dobrze), liczb\u0119 developer\u00f3w znaj\u0105cych ten j\u0119zyk, liczb\u0119 bibliotek i wiele, wiele wi\u0119cej.<\/p>\n\n\n\n<p>Ja chcia\u0142bym bardziej skupi\u0107 na tym drugim punkcie i opisa\u0107 klika podstawowych rzeczy, na kt\u00f3re sk\u0142ada si\u0119 j\u0119zyk Kotlin, a kt\u00f3re mniej lub bardziej u\u0142atwiaj\u0105 \u017cycie programisty.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Walka z nullami<\/h2>\n\n\n\n<p>W Kotlinie w bardzo \u0142atwy spos\u00f3b pozbyto si\u0119 NPE, czyli jednego chyba z najcz\u0119\u015bciej wyst\u0119puj\u0105cych i najbardziej kosztownych wyj\u0105tk\u00f3w na \u015bwiecie.<\/p>\n\n\n\n<p><em>Rozwi\u0105zanie<\/em>: Java zwyk\u0142y nullcheck albo Optional<\/p>\n\n\n\n<p><em>Przyk\u0142ad:<\/em><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nIf(value != null){\n\n  value.wykonaj()\n\n}\n<\/pre><\/div>\n\n\n<p><em>Rozwi\u0105zanie<\/em>: Kotlin operator ? kt\u00f3ry zast\u0119puje nullchecka<\/p>\n\n\n\n<p><em>Przyk\u0142ad:<\/em><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nvalue?.wykonaj()\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">2. Warto\u015bci domy\u015ble<\/h2>\n\n\n\n<p>Kotlin daje nam \u0142atw\u0105 mo\u017cliwo\u015b\u0107 ustawienia warto\u015bci domy\u015blnych w parametrach funkcji. Natomiast w Javie musimy stosowa\u0107, albo wzorzec Buildera albo przeci\u0105\u017ca\u0107 operatory.<\/p>\n\n\n\n<p><em>Rozwi\u0105zanie<\/em>: Java<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nUserBuilder.setName(\u201cGrzegorz\u201d).setSurname(Brzeczyszczykiewicz).setAge(24).build()\n<\/pre><\/div>\n\n\n<p>albo<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\npublic User(String name, String surname, Integer age) {\n\nthis.name = name;\n\nthis.surname = surname;\n\nthis.age = age;\n\n}\n\npublic User(String name, String surname) {\n\nthis (name, surname, 24);\n\n}\n<\/pre><\/div>\n\n\n<p><em>Rozwi\u0105zanie:<\/em> Kotlin<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nclass User(var name: String = &quot;&quot;, var surname: String = &quot;&quot;,var age=0)\n<\/pre><\/div>\n\n\n<p>Wykorzystujemy to w kodzie w taki spos\u00f3b<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nUser() , User(name= \u201cGrzegorz\u201d), itp.\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">3. Brak seter\u00f3w i getter\u00f3w<\/h2>\n\n\n\n<p>Przyj\u0119\u0142o si\u0119 \u017ce w Javie warto\u015bci p\u00f3l ustawia si\u0119 poprzez gettery, a pobiera poprzez settery. Jednak cz\u0119sto to prowadzi do sytuacji ze mamy jaka\u015b klas\u0119, kt\u00f3ra przechowuje dane i sk\u0142ada si\u0119 tylko z \u201cpustych\u201d setter\u00f3w i gettr\u00f3w. W Kotlinie gettery i settery s\u0105 generowane automatycznie.<\/p>\n\n\n\n<p><em>Przyk\u0142ad:<\/em> Java<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\npublic class User{\n\nprivate String name = \u201d\u201d\n\npublic void setName(String name){\n\nthis.name = name;\n\n}\n\npublic String getName(){\n\nreturn name\n\n}\n\n}\n<\/pre><\/div>\n\n\n<p><em>Przyk\u0142ad:<\/em> Kotlin<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nclass User(){\n\nvar name : String = \u201d\u201d\n\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">4. Specjalna klasa do przechowywania danych<\/h2>\n\n\n\n<p>W Javie nie ma \u017cadnej specjalnej klasy do przechowywania danych. Powoduje to oczywi\u015bcie pewne problemy np. z por\u00f3wnywaniem obiekt\u00f3w, kt\u00f3re zawieraj\u0105 takie same dane albo nawet z toString(). W Kotlinie istnieje specjalny typ klasy, kt\u00f3ry jest dedykowany danym, a mianowicie data.<\/p>\n\n\n\n<p>Przyk\u0142ad:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ndata class User(val name : String, val surname : String, val age : String)\n<\/pre><\/div>\n\n\n<p>R\u00f3\u017cnica mi\u0119dzy data class, a zwyk\u0142\u0105 klasa jest do\u015b\u0107 prosta, polega ona na tym ze Kotlin nadpisuje nam takie metody jak equals albo toString.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Funkcje rozszerzaj\u0105ce<\/h2>\n\n\n\n<p>Cz\u0119sto zdarza si\u0119 sytuacja, \u017ce jaka\u015b klasa, do kt\u00f3rej nie mamy dost\u0119pu (bo np. pochodzi z innej biblioteki) nie posiada metod, kt\u00f3re s\u0105 dla nas bardzo istotne. Cz\u0119sto w takiej sytuacji piszemy klasy Utils. Maj\u0105 nam pom\u00f3c w uzyskaniu tego, czego potrzebujemy. Problem polega na tym, \u017ce kto\u015b kto korzysta z owoc\u00f3w naszej pracy musi wiedzie\u0107, \u017ce taka klasa istnieje i nie trzeba jej pisa\u0107 od nowa. Oczywi\u015bcie pomijam fakt, \u017ce jest to po prostu brzydkie. W Kotlinie, aby rozwi\u0105za\u0107 ten problem, zosta\u0142y dodane funkcje rozszerzaj\u0105ce.<\/p>\n\n\n\n<p><em>Przyk\u0142ad:<\/em>&nbsp; Java<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\npublic class MapUtils{\n\npublic String rotateMap(map:Map){\n\n...rotate map\n\n}\n\n}\n<\/pre><\/div>\n\n\n<p><em>U\u017cycie: <\/em>MapUtils().rotateMap(map)<\/p>\n\n\n\n<p><em>Przyk\u0142ad:<\/em> Kotlin<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nfun Map.rotateMap(){\n\n...rotate map\n\n}\n<\/pre><\/div>\n\n\n<p><em>U\u017cycie: <\/em>Map.rotateMap()<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. \u0141atwiejsza obs\u0142uga string\u00f3w<\/h3>\n\n\n\n<p>Ci\u0119\u017cko sobie wyobrazi\u0107 program, kt\u00f3ry nie komunikowa\u0142by si\u0119 z u\u017cytkownikiem za pomoc\u0105 s\u0142owa pisanego. Niestety w Javie praca na stringach jest do\u015b\u0107 trudna. Sklejenia string\u00f3w powoduje, \u017ce kod jest nieczytelny i za\u015bmiecony. W Kotlinie istnieje mo\u017cliwo\u015b\u0107 wstawienia warto\u015bci bezpo\u015brednio w string.<\/p>\n\n\n\n<p><em>Przyk\u0142ad:<\/em> Java<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\npublic String getMyLovelyString(){\n\nreturn \u201cname \u201d+ name + \u201c surname \u201d+ surname \u201c age \u201d + age\n\n}\n<\/pre><\/div>\n\n\n<p><em>Przyk\u0142ad:<\/em>&nbsp; Kotlin<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nfun getMyLovelyString() : String{\n\nreturn \u201cname $name surname $surname age $age\u201d\n\n}\n<\/pre><\/div>\n\n\n<p>Oczywi\u015bcie takich udogodnie\u0144 jest du\u017co, du\u017co wi\u0119cej. Nawet, te kt\u00f3re przedstawi\u0142em powy\u017cej s\u0105 o wiele bardziej skomplikowane np. Z tym NPE to nie do ko\u0144ca prawda ;). Ale czas na podsumowanie.<\/p>\n\n\n\n<p>Podsumowuj\u0105c, Kotlin jest tym, czym Java b\u0119dzie najprawdopodobniej za kilka iteracji. Czyli j\u0119zykiem szybkim, bezpiecznym, stabilnym, a co najwa\u017cniejsze &#8211; \u0142atwym w u\u017cyciu i po prostu bardziej czytelnym.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;9872&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;19&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;2.8&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;2.8\\\/5 ( votes: 19)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Java 2.0 czyli Kotlin&quot;,&quot;width&quot;:&quot;75.7&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 75.7px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            2.8\/5 ( votes: 19)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>O Javie mo\u017cna m\u00f3wi\u0107 w dwojaki spos\u00f3b, albo o jednym z najbardziej popularnych j\u0119zyku programowania na \u015bwiecie, albo o maszynie &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/java-2-0-czyli-kotlin\/\">Continued<\/a><\/p>\n","protected":false},"author":263,"featured_media":9928,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[330,983],"class_list":["post-9872","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-java","tag-kotlin"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2020\/12\/java-2.0-czyli-kotlin.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9872"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/263"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=9872"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9872\/revisions"}],"predecessor-version":[{"id":25204,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/9872\/revisions\/25204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/9928"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=9872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=9872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=9872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}