{"id":257,"date":"2017-04-02T23:00:51","date_gmt":"2017-04-02T21:00:51","guid":{"rendered":"http:\/\/antek.atthost24.pl\/?p=257"},"modified":"2017-05-14T23:12:51","modified_gmt":"2017-05-14T21:12:51","slug":"niezmienne-obiekty-po-co-nam-one","status":"publish","type":"post","link":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/","title":{"rendered":"Niezmienne obiekty &#8211; po co nam one?"},"content":{"rendered":"<p>O ile poj\u0119cie niezmiennych obiekt\u00f3w nie brzmi zbyt znajomo, to o tyle na pewno s\u0142ysza\u0142e\u015b o Immutable Object. I o tym w\u0142a\u015bnie b\u0119dzie ten wpis.<\/p>\n<h3>Czym jest Immutable Object?<\/h3>\n<p>Tutaj nie ma \u017cadnego haczyka i nazwa dok\u0142adnie wskazuje o czym m\u00f3wimy. Immutable object jest to niezmienny obiekt, czyli taki, kt\u00f3rego stan nie mo\u017ce zosta\u0107 zmieniony ca\u0142y okres \u017cycia obiektu. Czyli po prostu tworzymy nasz obiekt wraz ze\u00a0wszystkimi wymaganymi atrybutami i \u017cadnego z nich nie mo\u017cemy zmieni\u0107. Przynajmniej w teorii :)&#8230; ale zmiany poprzez refleksje si\u0119 nie licz\u0105, wi\u0119c uznajemy, \u017ce nie mamy mo\u017cliwo\u015bci zmiany warto\u015bci tych atrybut\u00f3w \ud83d\ude09<\/p>\n<h3>Jakie s\u0105 zalety i wady tego podej\u015bcia?<\/h3>\n<p>Niezmienne obiekty, jak wszystko ;), maj\u0105 zalety i wady. Do najwa\u017cniejszych zalet wed\u0142ug mnie nale\u017c\u0105:<\/p>\n<ul>\n<li>S\u0105 \u0142atwiejsze w u\u017cyciu i testowaniu<\/li>\n<li>Mo\u017cna je bezpiecznie u\u017cywa\u0107 w Setach lub jako klucz w Mapach<\/li>\n<li>Mog\u0105 by\u0107 \u0142atwo cachowane<\/li>\n<li>Immutable object mog\u0105 by\u0107 bezpiecznie u\u017cywane w programowaniu wielow\u0105tkowym. Stan tych obiekt\u00f3w nie mo\u017ce ulec zmianie, wi\u0119c mamy pewno\u015b\u0107, \u017ce ka\u017cdy w\u0105tek widzi aktualny stan obiektu \ud83d\ude09<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-263 aligncenter\" src=\"http:\/\/antek.atthost24.pl\/wp-content\/uploads\/2017\/03\/mutable_variable.jpg\" alt=\"\" width=\"552\" height=\"367\" srcset=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/03\/mutable_variable.jpg 552w, https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/03\/mutable_variable-300x199.jpg 300w\" sizes=\"auto, (max-width: 552px) 100vw, 552px\" \/><\/li>\n<\/ul>\n<p>Wady Immutable Object:<\/p>\n<ul>\n<li>Nadmiarowy kod &#8211; musimy dopisa\u0107 kilka finali, ale za to pozbywamy si\u0119 setter\u00f3w \ud83d\ude09<\/li>\n<li>Inicjalizacja wszystkich p\u00f3l przez konstruktory. Poniewa\u017c wszystkie nasze pola s\u0105 oznaczone jako final, musz\u0105 wi\u0119c zosta\u0107 zainicjalizowane w konstruktorze. A co jak nie chcemy zawsze podawa\u0107 warto\u015bci wszystkich parametr\u00f3w, tylko u\u017cy\u0107 domy\u015blnych warto\u015bci dla niekt\u00f3rych p\u00f3l? Wtedy musimy stworzy\u0107 osobny konstruktor dla ka\u017cdej kombinacji p\u00f3l, kt\u00f3r\u0105 chcemy u\u017cy\u0107.<\/li>\n<li>Problem z wydajno\u015bci\u0105 &#8211; za ka\u017cdym razem, gdy chcemy wprowadzi\u0107 zmian\u0119 w naszym obiekcie to sprowadza si\u0119 to do utworzenia nowego obiektu. Mo\u017ce to by\u0107 odczuwalne zar\u00f3wno w czasie dzia\u0142ania aplikacji, jak i zu\u017cyciu pami\u0119ci.<\/li>\n<\/ul>\n<h3>Kiedy ich u\u017cywa\u0107?<\/h3>\n<p>Jest na pewno kilka podstawowych use-case\u00f3w, kiedy powinni\u015bmy rozwa\u017cy\u0107 u\u017cycie niezmiennych obiekt\u00f3w:<\/p>\n<ul>\n<li>programowanie wielow\u0105tkowe &#8211; je\u017celi mamy obiekt, kt\u00f3ry ma by\u0107 wsp\u00f3\u0142dzielony pomi\u0119dzy w\u0105tkami to zdecydowanie warto rozwa\u017cy\u0107 u\u017cycie immutable object<\/li>\n<li>obiekt u\u017cywany jako klucz (np. w mapach) &#8211; mamy wtedy pewno\u015b\u0107, \u017ce klucz nie zostanie zmieniony kiedy jest ju\u017c w u\u017cyciu i nie b\u0119dzie kolizji<\/li>\n<li>obiekt ma by\u0107 typowym 'value object&#8217; &#8211; wydaje si\u0119 oczywiste \ud83d\ude09<\/li>\n<\/ul>\n<p>Z drugiej strony powinni\u015bmy\u00a0sk\u0142ania\u0107 si\u0119 ku 'standardowym obiektom&#8217;, kiedy mamy do czynienia:<\/p>\n<ul>\n<li>z du\u017cymi obiektami, kt\u00f3rych tworzenie zajmie du\u017co czasu i\/lub pami\u0119ci<\/li>\n<li>obiektami, kt\u00f3re posiadaj\u0105 'to\u017csano\u015b\u0107&#8217;, tzn. reprezentuj\u0105 osoby\/rzeczy, dla kt\u00f3rych zmiana pewnych parametr\u00f3w jest naturalna np. samoch\u00f3d, dla kt\u00f3rego naturalnymi jest zmiana takich parametr\u00f3w jak pr\u0119dko\u015b\u0107 czy poziom paliwa.<\/li>\n<\/ul>\n<h3>Implementacja Immutable Object w Javie<\/h3>\n<p>Stworzenie Immutable Object w Javie jest dosy\u0107 proste. Wystarczy przestrzega\u0107 kilku wskaz\u00f3wek \ud83d\ude42<\/p>\n<ol>\n<li>Wszystkie pola powinny posiada\u0107 modyfikatory private i final.<\/li>\n<li>Nie tworzymy setter\u00f3w (wynika to zreszt\u0105 z u\u017cycia modyfikatora final przy polach).<\/li>\n<li>Musimy zabezpieczy\u0107 nasz\u0105 klas\u0119, \u017ceby nie mo\u017cna by\u0142o po niej dziedziczy\u0107.<\/li>\n<li>Je\u017celi pola naszej klasy zawieraj\u0105 mutable object, wtedy musimy zabezpieczy\u0107 te obiekty przed zmian\u0105.<\/li>\n<\/ol>\n<p>Pora na przyk\u0142ad, kt\u00f3ry zobrazuje nam powy\u017csze zasady.<\/p>\n<pre class=\"lang:java decode:true\">public final class MyImmutableObject { \/\/ uzywajac final zapewniamy, ze po klasie nie mozna dziedziczyc\r\n\tprivate final String name; \/\/ wszystkie pola maja modyfikatory private i final\r\n\tprivate final int age;\r\n\tprivate final List&lt;String&gt; plants;\r\n\tprivate final List&lt;Pet&gt; pets; \/\/ uzywajac innych obiektow, musimy zapewnic ich niezmiennosc\r\n\r\n\tpublic MyImmutableObject(String name, int age, List&lt;Pet&gt; pets, List&lt;String&gt; plants) {\r\n\t\tthis.name = name;\r\n\t\tthis.age = age;\r\n\t\t\/\/ uzywajac list musimy pamietac o trzech rzeczach:\r\n\t\t\/\/ 1. Obiekty w listach powinny rowniez byc Immutable\r\n \t\t\/\/ 2. Stworzyc kopie przekazanej listy, zeby zabezpieczyc sie przez jej modyfikacja z zewnatrz\r\n\t\t\/\/ 3. W gecie zwracac kopie listy lub uzyc unmodifiableList lub innej listy, ktorej nie mozna edytowac\r\n\t\tthis.pets = Collections.unmodifiableList(new ArrayList(pets));\r\n\t\tthis.plants = Collections.unmodifiableList(new ArrayList(plants));\r\n\t}\r\n\r\n\tpublic String getName() { \/\/ zadne z pol nie ma settera\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n\r\n\tpublic List&lt;Pet&gt; getPets() {\r\n\t\treturn pets;\r\n\t}\r\n\r\n\tpublic List&lt;String&gt; getPlants() {\r\n\t\treturn plants;\r\n\t}\r\n}<\/pre>\n<h3>Troch\u0119 optymalizacji<\/h3>\n<p>Je\u017celi nasz niezmienny object b\u0119dzie na prawd\u0119 cz\u0119sto u\u017cywany w naszej aplikacji mo\u017cemy rozwa\u017cy\u0107 pewne optymalizacje.<\/p>\n<p>Jedn\u0105 z technik, kt\u00f3r\u0105 mo\u017cemy u\u017cy\u0107 jest Pooling. Jest on np. u\u017cyty w JVM w przypadku String\u00f3w. Poni\u017cej przedstawi\u0119 bardzo prymitywn\u0105 implementacje tego podej\u015bcia.<\/p>\n<p>Na pocz\u0105tku stw\u00f3rzmy jeszcze nasz immutable object, kt\u00f3rego u\u017cycie b\u0119dizemy chcieli zoptymalizowa\u0107.<\/p>\n<pre class=\"lang:java decode:true \">public final class Person {\r\n\tprivate final String name;\r\n\tprivate final int age;\r\n\r\n\tpublic Person(String name, int age) {\r\n\t\tthis.name = name;\r\n\t\tthis.age = age;\r\n\t}\r\n\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic int getAge() {\r\n\t\treturn age;\r\n\t}\r\n}\r\n<\/pre>\n<p>I teraz prosty mechanizm poolingu:<\/p>\n<pre class=\"lang:java decode:true \">public class PersonPool {\r\n\tprivate static final Map&lt;String, Map&lt;Integer, Person&gt;&gt; PEOPLE = new HashMap&lt;&gt;();\r\n\r\n\tpublic static Person getPerson(final String name, final int age) {\r\n\t\tif (PEOPLE.containsKey(name)) {\r\n\t\t\tif (PEOPLE.get(name).containsKey(age)) {\r\n\t\t\t\t\/\/ jesli w naszej mapie istnieje osoba o tej samej nazwie\r\n\t\t\t\t\/\/ i wieku to zwracamy utworzona wczesniej osobe\r\n\t\t\t\treturn PEOPLE.get(name).get(age);\r\n\t\t\t} else {\r\n\t\t\t\t\/\/ jezeli istnieje osoba o tym samym imieniu, ale nie wieku\r\n\t\t\t\t\/\/ to tworzymy nowa osobe, dodajemy do poli i zwracamy utworzony obiekt\r\n\t\t\t\tPerson p = new Person(name, age);\r\n\t\t\t\tPEOPLE.get(name).put(age, p);\r\n\t\t\t\treturn p;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t\/\/ jezeli nie istnieje osoba o takim imieniu to rowniez tworzemy nowa osobe\r\n\t\t\t\/\/ i dodajemy ja do naszej poli\r\n\t\t\tPerson p = new Person(name, age);\r\n\t\t\tPEOPLE.put(name, new HashMap&lt;&gt;());\r\n\t\t\tPEOPLE.get(name).put(age, p);\r\n\t\t\treturn p;\r\n\t\t}\r\n\t}\r\n}<\/pre>\n<p>Og\u00f3lnie m\u00f3wi\u0105c ide\u0105 jest powt\u00f3rne u\u017cycie wcze\u015bniej utworzonego obiektu, je\u017celi jest taki sam jak by\u015bmy chcieli stworzy\u0107.<\/p>\n<p>Przy u\u017cywaniu poolingu powinni\u015bmy mie\u0107 na uwadze, \u017ce o ile w \u015brodowisku jednow\u0105tkowym powinien sprawdzi\u0107 si\u0119 ca\u0142kiem nie\u017ale, o tyle przy wielu w\u0105tkach narzut na synchronizacje mo\u017ce by\u0107 znacz\u0105cy.<\/p>\n<h3>Podsumowanie<\/h3>\n<p>We wpisie postara\u0142em przedstawi\u0107 si\u0119 ide\u0119 niezmiennych obiekt\u00f3w, ich wady oraz zalety. Pokaza\u0142em r\u00f3wnie\u017c jak zaimplementowa\u0107 taki obiekt w Javie oraz zaproponowa\u0142em pewn\u0105 optymalizacje, kt\u00f3r\u0105 mo\u017cemy u\u017cy\u0107, aby zwi\u0119kszy\u0107 wydajno\u015b\u0107 naszej aplikacji w przypadku cz\u0119stego korzystania z naszego immutable object.<\/p>\n<h4>UPDATE 14.05.2017<\/h4>\n<p>Kolega zwr\u00f3ci\u0142 mi uwag\u0119 na b\u0142\u0105d, kt\u00f3ry by\u0142 w listingu z implementacj\u0105 niezmiennej klasy w Javie &#8211; teraz wszystko powinno by\u0107 ok \ud83d\ude42<\/p>\n<p>Zwr\u00f3ci\u0142 r\u00f3wnie\u017c uwag\u0119, \u017ce warto doda\u0107 wzmiank\u0119 o poolingu w \u015brodowisku wielow\u0105tkowym &#8211; dodane \ud83d\ude42<\/p>\n<p>Dzi\u0119ki \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O ile poj\u0119cie niezmiennych obiekt\u00f3w nie brzmi zbyt znajomo, to o tyle na pewno s\u0142ysza\u0142e\u015b o Immutable Object. I o tym w\u0142a\u015bnie b\u0119dzie ten wpis. Czym jest Immutable&#8230;<\/p>\n","protected":false},"author":1,"featured_media":297,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,7],"tags":[],"class_list":["post-257","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dsp2017","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Niezmienne obiekty - po co nam one? - Lukasz Antkowiak&#039;s blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Niezmienne obiekty - po co nam one? - Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"og:description\" content=\"O ile poj\u0119cie niezmiennych obiekt\u00f3w nie brzmi zbyt znajomo, to o tyle na pewno s\u0142ysza\u0142e\u015b o Immutable Object. I o tym w\u0142a\u015bnie b\u0119dzie ten wpis. Czym jest Immutable...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukasz Antkowiak&#039;s blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-02T21:00:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-05-14T21:12:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/04\/immutability_ancient_aliens.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"500\" \/>\n\t<meta property=\"og:image:height\" content=\"437\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0141ukasz Antkowiak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0141ukasz Antkowiak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/\",\"name\":\"Niezmienne obiekty - po co nam one? - Lukasz Antkowiak&#039;s blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\"},\"datePublished\":\"2017-04-02T21:00:51+00:00\",\"dateModified\":\"2017-05-14T21:12:51+00:00\",\"author\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/blog.lantkowiak.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Niezmienne obiekty &#8211; po co nam one?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#website\",\"url\":\"https:\/\/blog.lantkowiak.pl\/\",\"name\":\"Lukasz Antkowiak&#039;s blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6\",\"name\":\"\u0141ukasz Antkowiak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g\",\"caption\":\"\u0141ukasz Antkowiak\"},\"description\":\"dd\",\"url\":\"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Niezmienne obiekty - po co nam one? - Lukasz Antkowiak&#039;s blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/","og_locale":"pl_PL","og_type":"article","og_title":"Niezmienne obiekty - po co nam one? - Lukasz Antkowiak&#039;s blog","og_description":"O ile poj\u0119cie niezmiennych obiekt\u00f3w nie brzmi zbyt znajomo, to o tyle na pewno s\u0142ysza\u0142e\u015b o Immutable Object. I o tym w\u0142a\u015bnie b\u0119dzie ten wpis. Czym jest Immutable...","og_url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/","og_site_name":"Lukasz Antkowiak&#039;s blog","article_published_time":"2017-04-02T21:00:51+00:00","article_modified_time":"2017-05-14T21:12:51+00:00","og_image":[{"width":500,"height":437,"url":"https:\/\/blog.lantkowiak.pl\/wp-content\/uploads\/2017\/04\/immutability_ancient_aliens.jpg","type":"image\/jpeg"}],"author":"\u0141ukasz Antkowiak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"\u0141ukasz Antkowiak","Szacowany czas czytania":"6 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/","url":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/","name":"Niezmienne obiekty - po co nam one? - Lukasz Antkowiak&#039;s blog","isPartOf":{"@id":"https:\/\/blog.lantkowiak.pl\/#website"},"datePublished":"2017-04-02T21:00:51+00:00","dateModified":"2017-05-14T21:12:51+00:00","author":{"@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6"},"breadcrumb":{"@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.lantkowiak.pl\/index.php\/2017\/04\/02\/niezmienne-obiekty-po-co-nam-one\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/blog.lantkowiak.pl\/"},{"@type":"ListItem","position":2,"name":"Niezmienne obiekty &#8211; po co nam one?"}]},{"@type":"WebSite","@id":"https:\/\/blog.lantkowiak.pl\/#website","url":"https:\/\/blog.lantkowiak.pl\/","name":"Lukasz Antkowiak&#039;s blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.lantkowiak.pl\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/009bfc4db220c225786c59b1748ba1e6","name":"\u0141ukasz Antkowiak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/blog.lantkowiak.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e18e2bfe319da9b5757cf7f7ae1bfecf?s=96&d=monsterid&r=g","caption":"\u0141ukasz Antkowiak"},"description":"dd","url":"https:\/\/blog.lantkowiak.pl\/index.php\/author\/antek\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/comments?post=257"}],"version-history":[{"count":12,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/257\/revisions"}],"predecessor-version":[{"id":360,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/posts\/257\/revisions\/360"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media\/297"}],"wp:attachment":[{"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/media?parent=257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/categories?post=257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.lantkowiak.pl\/index.php\/wp-json\/wp\/v2\/tags?post=257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}