{"id":3571,"date":"2017-01-16T09:51:43","date_gmt":"2017-01-16T08:51:43","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=3571"},"modified":"2023-08-28T13:16:44","modified_gmt":"2023-08-28T11:16:44","slug":"czy-swiat-konczy-sie-na-javie-kilka-ciekawostek-o-kotlinie","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/czy-swiat-konczy-sie-na-javie-kilka-ciekawostek-o-kotlinie\/","title":{"rendered":"Czy \u015bwiat ko\u0144czy si\u0119 na Javie? Kilka ciekawostek o Kotlinie"},"content":{"rendered":"\n<p>Wi\u0119kszo\u015b\u0107 programist\u00f3w Java stara si\u0119 \u015bledzi\u0107, co dzieje si\u0119 w spo\u0142eczno\u015bci dotycz\u0105cej tego j\u0119zyka programowania. Niew\u0105tpliwie ka\u017cdy z tego grona powie, \u017ce Java 8 jest du\u017cym krokiem do przodu w tym jak\u017ce ciekawym ekosystemie. Na pocz\u0105tku wszystkiego powinni\u015bmy jednak zada\u0107 sobie podstawowe pytanie, w jakim celu powsta\u0142a <a href=\"http:\/\/kariera.sii.pl\/dla-studentow\/\" rel=\"nofollow\" >Java<\/a>?<\/p>\n\n\n\n<p>Ka\u017cdy, kto mia\u0142 styczno\u015b\u0107 z innymi j\u0119zykami programowania, w moim przypadku by\u0142 to PASCAL, DELPHI czy te\u017c C\/C++ pewnie zgodzi si\u0119 ze mn\u0105, \u017ce Java by\u0142a czym\u015b w rodzaju alternatywy dla C, w pewnej ga\u0142\u0119zi zastosowa\u0144. Jak mo\u017cna zauwa\u017cy\u0107 sk\u0142adnia Javy zbyt wiele nie odbiega od C++, natomiast to, co wprowadza to mechanizm Garbage Collector&#8217;a dbaj\u0105cy o zarz\u0105dzanie pami\u0119ci\u0105. W tym wpisie chcia\u0142em Wam zwr\u00f3ci\u0107 uwag\u0119 na kolejn\u0105 ciekawostk\u0119 w obszarze Java i spr\u00f3bowa\u0107 odpowiedzie\u0107, czym tak naprawd\u0119 jest Kotlin?<\/p>\n\n\n\n<p>Nazywaj\u0105c <a href=\"https:\/\/kotlinlang.org\/\" rel=\"nofollow\" >Kotlin<\/a> frameworkiem do Javy nie miniemy si\u0119 daleko z prawd\u0105. Powsta\u0142 w do\u015b\u0107 zaawansowanym stadium rozwoju Javy. Dodatkowo w procesie jego tworzenia wykonano znacznie mniej zmian koncepcyjnych ni\u017c w <a href=\"http:\/\/sii.pl\/oferty-pracy\/all\/all\/10\/?js=java\">Java<\/a> wzgl\u0119dem C++. Powsta\u0142 w\u0142a\u015bnie po to, aby uporz\u0105dkowa\u0107 kod Javy. Za jego rozwojem stoi czeska firma JetBrains (znana g\u0142\u00f3wnie z narz\u0119dzi programistycznych tj. IntelliJ), i jak nie \u0142atwo zgadn\u0105\u0107 jest przez nich silnie promowany. Z ciekawostek pe\u0142ne wsparcie dla Kotlina znajdziemy w wersji Community dost\u0119pnej na licencji Apache-2.0.<\/p>\n\n\n\n<p><em>J\u0119zyk ten g\u0142\u00f3wnie skupia si\u0119 na:<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Zwi\u0119z\u0142o\u015bci (Concise)<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Pod tym has\u0142em kryje si\u0119 minimalizacja ilo\u015bci sta\u0142ego kodu. Mowa o nieod\u0142\u0105cznych elementach klasy tj. gettery, settery, equals, hashcode, toString, copy. S\u0105 to nieod\u0142\u0105czne elementy klasy, kt\u00f3re nie wnosz\u0105 zbyt wiele do kodu a jednak s\u0105. Spokojnie mog\u0105 by\u0107 przecie\u017c obs\u0142ugiwane w spos\u00f3b generyczny. W tym momencie zacytuj\u0119 tekst us\u0142yszany na jednej z prezentacji \u201eNajlepszy jest ten kod, kt\u00f3rego nie ma, gdy\u017c nie trzeba go utrzymywa\u0107\u201d. W prawdzie istniej\u0105 narz\u0119dzia, kt\u00f3re mo\u017cemy zaprz\u0105c w Javie. Przyk\u0142adem takiego narz\u0119dzia mo\u017ce by\u0107 Lombok. Jego u\u017cycie polega na dodaniu do projektu zale\u017cno\u015bci, oraz odpowiednich adnotacji nad deklaracj\u0105 klas\/zmiennych m\u00f3wi\u0105cych, co ma by\u0107 wygenerowane. Reszt\u0119 zrobi kompilator&nbsp; na etapie generowania bytecode\u2019u. Jednak jak to w praktyce bywa nic nie jest idealne, tak te\u017c Lombok. Problem pojawia si\u0119, gdy chcemy u\u017cy\u0107 wygenerowany kod w po\u0142\u0105czeniu z innym dialektem (tj. Kotlin czy Groovy), poniewa\u017c na etapie ich kompilacji nie zosta\u0142 on jeszcze wygenerowany.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bezpiecze\u0144stwie (Safe)<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Id\u0105c dalej w koncepcji j\u0119zyka dochodzimy do koszmaru programisty, czyli tzw. NullPointerException. Tu w prawdzie zagorza\u0142y Javowiec powie: \u201ePrzecie\u017c mamy Optional\u201d. Pomijaj\u0105c kwestie nieprawid\u0142owego wykorzystania Optionala doszuka\u0142em si\u0119 kilku wad tego rozwi\u0105zania. Optional jest o wiele bardziej przyjazny ni\u017c ka\u017cdorazowe sprawdzanie null, lecz jednak d\u0142ugo\u015b\u0107 linii ro\u015bnie w zawrotnym tempie, co niestety pogarsza czytelno\u015b\u0107 kodu&nbsp;.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Poni\u017cej przyk\u0142ad tego samego kodu Java vs Kotlin:<\/span><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; gutter: false; title: ; notranslate\" title=\"\">\nVeryLongClassName variable = matchSth()\n  String value = Optional.ofNullable(variable).map( VeryLongClassName::getValue).orElse(&quot;&quot;)\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\n var variable : VeryLongClassName? = matchSth()\n var value : String = var?.value ?: &quot;&quot;\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wrzechstronno\u015bci (Versatile) i interoperacyjno\u015bci (Interoperable)<\/strong><\/li>\n<\/ul>\n\n\n\n<p>To co najwa\u017cniejsze (to co mo\u017ce zadecydowa\u0107 o tym czy tego spr\u00f3buj\u0119), jest fakt, \u017ce Kotlin nie odcina si\u0119 od Javy, lecz tak naprawd\u0119 opakowuje kod Javovy w swoj\u0105 nak\u0142adk\u0119. W efekcie mo\u017cemy tworzy\u0107 sw\u00f3j kod w spos\u00f3b hybrydowy wykorzystuj\u0105c zar\u00f3wno Jav\u0119 jak i Kotlin.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wygodnej obr\u00f3bce &#8211; Tooling<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Nie oby\u0142o si\u0119 bez reklamy produktu JetBrains. Mowa tu o doskona\u0142ym wsparciu przez \u015brodowisko IntelliJ.<\/p>\n\n\n\n<p><em>Tyle z marketingowych plus\u00f3w, przejd\u017amy do minus\u00f3w i tego jak to spisuje si\u0119 w praktyce.<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span style=\"color: #993300;\">Wady<\/span><\/h3>\n\n\n\n<p>Mieszane uczucia wywo\u0142uje nowa sk\u0142adnia. Patrz\u0105c po raz pierwszy na kod w Kotlinie czu\u0142em si\u0119 troch\u0119 nieswojo. Sk\u0142adnia jest inna ni\u017c to, do czego by\u0142em przyzwyczajony, lecz po stworzeniu kilku klas oraz kilkudziesi\u0119ciu linii kodu, sk\u0142adnie uwa\u017cam za intuicyjn\u0105.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\">Poni\u017cej przyk\u0142ad kodu z wykorzystaniem Spring, napisanego w Javie oraz Kotlinie:<\/span><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; gutter: false; title: ; notranslate\" title=\"\">\n@RestController\npublic class HelloWorldJava {\n    final HelloAction helloAction;\n    @Autowired\n    public HelloWorldJava( HelloAction helloAction ) {\n        this.helloAction = helloAction;\n    }\n    @RequestMapping(&quot;\/java&quot;)\n    public String helloWorld (String name) {\n        helloAction.doAction();\n        return &quot;Hello &quot; + name;\n    }\n}\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\n@RestController\nopen class HelloWorldKotlin (\n        open val helloAction: HelloAction) {\n@RequestMapping(&quot;\/kotlin&quot;)\n    fun helloWorld (name : String) : String {\n            helloAction.doAction()\n            return &quot;Hello &quot; + name\n    }\n}\n<\/pre><\/div>\n\n\n<p>Wada, kt\u00f3r\u0105 odczu\u0142em z tego tytu\u0142u jest fakt, \u017ce kod na etapie kompilacji jest przek\u0142adany na kod Javy, co nie wsp\u00f3\u0142gra np. z bibliotek\u0105&nbsp;Lombok (kt\u00f3ry ju\u017c mam w swoim kodzie, a jest on tak\u017ce uruchamiany na etapie generowania bytecode&#8217;u). Prawdopodobnie mo\u017cna by to wysterowa\u0107 na poziomie skryptu buduj\u0105cego, ale na to nie znalaz\u0142em ju\u017c czasu. Kr\u00f3tko m\u00f3wi\u0105c mamy kompatybilno\u015b\u0107 z Jav\u0105, ale z pluginami niekoniecznie.<\/p>\n\n\n\n<p>Podsumowuj\u0105c &#8211; korzystam z tego j\u0119zyka od kilku miesi\u0119cy i nie jestem w stanie wymieni\u0107 wi\u0119cej jego wad. Sk\u0142adnia, kt\u00f3ra na pocz\u0105tku by\u0142a co najmniej dziwna przypominaj\u0105c\u0105 troch\u0119 powr\u00f3t do korzeni tj. PASCAL w po\u0142\u0105czeniu z PHP, jest intuicyjna i przyjazna.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span style=\"color: #993300;\">Zalety<\/span><\/h3>\n\n\n\n<p>Do niew\u0105tpliwych zalet nale\u017cy unikanie NullPointerException, kt\u00f3re pozwala na okre\u015blenie, kt\u00f3re zmienne mog\u0105 by\u0107 nullem, a kt\u00f3re nie, oraz wy\u0142apywanie tych nieprawid\u0142owo\u015bci z poziomu \u015brodowiska programistycznego. Rozwi\u0105zanie to w przeciwie\u0144stwie do Optionala nie wyd\u0142u\u017ca geometrycznie kodu.<\/p>\n\n\n\n<p>Kolejnym z plus\u00f3w jest rozwi\u0105zanie (przypominaj\u0105ce troch\u0119 .NET), kt\u00f3re t\u0142umaczy nawigacje po getterach i setterach, jako dost\u0119p \u201eproperty\u201d. Podobnie jak w .NET tak i w Kotlinie, gettery i setery mog\u0105 by\u0107 nadpisywane na etapie deklaracji zmiennej, a nie odr\u0119bnej metody.<\/p>\n\n\n\n<p>Jedn\u0105 z ciekawszych nowinek, kt\u00f3re wprowadza ten j\u0119zyk jest dynamiczne typowanie (znane wcze\u015bniej z .NET), po\u0142\u0105czone ze wsparciem \u015brodowiska programistycznego.<\/p>\n\n\n\n<p>Checked-exceptions \u2013 niby wszyscy wiedz\u0105, \u017ce to pora\u017cka, ale mimo wszystko s\u0105 w Javie. Nie da si\u0119 ukry\u0107, \u017ce wyj\u0105tki z grupy checked s\u0105 ogromn\u0105 kul\u0105 u nogi w jak\u017ce dynamicznie rozwijaj\u0105cej si\u0119 Javie. W przypadku deklaracji metod da si\u0119 w czytelny spos\u00f3b przerzuci\u0107 je wy\u017cej. Problem pojawia si\u0119, gdy korzystamy z tzw. FunctionalApi, kt\u00f3re to wymusza na nas reakcj\u0119.<\/p>\n\n\n\n<p>Nie da si\u0119 ukry\u0107, \u017ce mo\u017cliwo\u015b\u0107 traktowania checked exceptions tak samo jak unchecked znacznie poprawia czytelno\u015b\u0107 kodu. Dociekliwi mog\u0105 spyta\u0107 \u201ea co je\u015bli chcemy u\u017cy\u0107 checked-exception, kt\u00f3ry ma by\u0107 przekazany do kodu Javy?\u201d, Kotlin pozwoli na to poprzez adnotacj\u0119 @kotlin.jvm.Throws<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> <strong style=\"color: revert; font-size: 2rem;\">Ciekawa funkcjonalno\u015b\u0107<\/strong> <\/li>\n<\/ul>\n\n\n\n<p>Modyfikatory Java: jakie s\u0105 domy\u015blne w Javie chyba pisa\u0107 nie musz\u0119, jak to wygl\u0105da w Kotlinie? Deklarowane klasy, jak te\u017c zmienne s\u0105 domy\u015blnie public (konwertowane na get\/set) oraz final. Kwesti\u0119 widoczno\u015bci mo\u017cna nadpisa\u0107 odpowiednim modyfikatorem, natomiast final modyfikatorem open. Wprowadza to pewien element \u0142amig\u0142\u00f3wki \u0142\u0105cz\u0105c kotlina z frameworkiem Spring.<\/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;3571&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;5&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;3.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;3.8\\\/5 ( votes: 5)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Czy \u015bwiat ko\u0144czy si\u0119 na Javie? Kilka ciekawostek o Kotlinie&quot;,&quot;width&quot;:&quot;104.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: 104.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            3.8\/5 ( votes: 5)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Wi\u0119kszo\u015b\u0107 programist\u00f3w Java stara si\u0119 \u015bledzi\u0107, co dzieje si\u0119 w spo\u0142eczno\u015bci dotycz\u0105cej tego j\u0119zyka programowania. Niew\u0105tpliwie ka\u017cdy z tego grona &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/czy-swiat-konczy-sie-na-javie-kilka-ciekawostek-o-kotlinie\/\">Continued<\/a><\/p>\n","protected":false},"author":91,"featured_media":3671,"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":[],"class_list":["post-3571","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2017\/01\/kotlin_800x320.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/3571"}],"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\/91"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=3571"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/3571\/revisions"}],"predecessor-version":[{"id":23833,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/3571\/revisions\/23833"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/3671"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=3571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=3571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=3571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}