{"id":16597,"date":"2022-10-31T05:00:00","date_gmt":"2022-10-31T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=16597"},"modified":"2023-02-16T14:13:17","modified_gmt":"2023-02-16T13:13:17","slug":"local-variable-type-inference-var-w-java-10","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/local-variable-type-inference-var-w-java-10\/","title":{"rendered":"Local Variable Type Inference (var) w Java 10"},"content":{"rendered":"\n<p>Jedn\u0105 z nowo\u015bci wprowadzonych w j\u0119zyku Java w wersji 10 jest mechanizm okre\u015blany jako <strong>Local Variable Type Inference,<\/strong> w skr\u00f3cie var<strong>.<\/strong> Pozwala on na wnioskowanie typu zmiennej lokalnej na podstawie kontekstu w jakim zosta\u0142a u\u017cyta.<\/p>\n\n\n\n<p>Wcze\u015bniejsze wersje j\u0119zyka Java wymaga\u0142y deklaracji typu dla zmiennych lokalnych. Nowsze wersje okre\u015blaj\u0105 typ zmiennej lokalnej w trakcie kompilacji na podstawie typu, kt\u00f3rym s\u0105 one inicjowane.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wykorzystanie var w deklaracji zmiennej lokalnej<\/strong><\/h2>\n\n\n\n<p>U\u017cycie var w deklaracji zmiennej lokalnej oznacza, \u017ce programista zostawia ustalenie typu kompilatorowi, kt\u00f3ry sprawdzaj\u0105c kontekst u\u017cycia zmiennej, wnioskuje dla niej typ.<\/p>\n\n\n\n<p>Poni\u017cej przyk\u0142ad pokazuje proste u\u017cycie var.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-9.png\"><img decoding=\"async\" width=\"582\" height=\"155\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-9.png\" alt=\"proste u\u017cycie var\" class=\"wp-image-16598\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-9.png 582w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-1-9-300x80.png 300w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>W przyk\u0142adzie tym nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na kilka istotnych kwestii:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>Typ zadeklarowany przez kompilator to ArrayList&lt;String&gt;<string>, a nie List&lt;String&gt;<string>.<\/string><\/string><\/li><li>Charakterystyczne dla tego typu inicjalizacji zmiennej jest podanie typu dla element\u00f3w przechowywanych w ArrayList&lt;String&gt; <string> w celu precyzyjnego ustalenia typu przechowywanego w li\u015bcie. Brak tego typu powoduje przyj\u0119cie Object jako typu element\u00f3w listy.<\/string><\/li><\/ol>\n\n\n\n<p>Przyk\u0142ad poni\u017cej przedstawia opisywan\u0105 w punkcie drugim sytuacj\u0119 z punktu widzenia kodu \u017ar\u00f3d\u0142owego oraz wygenerowanego przez kompilator kodu bajtowego w przypadku, kiedy zdefiniujemy konkretny typ w li\u015bcie lub gdy go nie podamy.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-2-8.png\"><img decoding=\"async\" width=\"707\" height=\"390\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-2-8.png\" alt=\"kod\" class=\"wp-image-16600\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-2-8.png 707w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-2-8-300x165.png 300w\" sizes=\"(max-width: 707px) 100vw, 707px\" \/><\/a><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-3-8.png\"><img decoding=\"async\" width=\"1024\" height=\"756\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-3-8-1024x756.png\" alt=\"kod\" class=\"wp-image-16602\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-3-8-1024x756.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-3-8-300x222.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-3-8-768x567.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-3-8.png 1228w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wcze\u015bniejsze wersje var<\/strong><\/h2>\n\n\n\n<p>Mechanizm wnioskowania typ\u00f3w u\u017cywany przez var nie jest nowo\u015bci\u0105 w j\u0119zyku Java. Jego pierwsze u\u017cycie mia\u0142o miejsce ju\u017c w wersji 5 tego j\u0119zyka. Poni\u017cej przyk\u0142ad dzia\u0142ania mechanizmu wnioskowania w Java 5 oraz wygenerowany kod bajtowy.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-4-6.png\"><img decoding=\"async\" width=\"1005\" height=\"352\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-4-6.png\" alt=\"kod\" class=\"wp-image-16605\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-4-6.png 1005w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-4-6-300x105.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-4-6-768x269.png 768w\" sizes=\"(max-width: 1005px) 100vw, 1005px\" \/><\/a><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-5-4.png\"><img decoding=\"async\" width=\"1024\" height=\"612\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-5-4-1024x612.png\" alt=\"kod\" class=\"wp-image-16607\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-5-4-1024x612.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-5-4-300x179.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-5-4-768x459.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-5-4.png 1288w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>W kolejnych wersjach j\u0119zyka rozszerzono zakres u\u017cycia mechanizmu wnioskowania o notacj\u0119 \u201ediamentow\u0105\u201d &lt;&gt; oraz obs\u0142ug\u0119 parametr\u00f3w <a href=\"https:\/\/sii.pl\/blog\/wyrazenie-lambda-w-javie\/?category=development-na-twardo&amp;tag=software-development,java,wyrazenie-lambda\" target=\"_blank\" rel=\"noreferrer noopener\">w wyra\u017ceniu lambda<\/a>. Programista nie musi definiowa\u0107 typ\u00f3w parametr\u00f3w dla takiego wyra\u017cenia. W wersji 10 wprowadzono var, umo\u017cliwiaj\u0105c programi\u015bcie tworzenie zmiennych lokalnych bez deklaracji typu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jaki jest cel var?<\/strong><\/h2>\n\n\n\n<p>Podstawowym celem var jest zwi\u0119kszenie czytelno\u015bci kodu i zwi\u0119kszenie efektywno\u015bci programist\u00f3w. Poni\u017cej kilka przyk\u0142ad\u00f3w u\u017cycia var.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-6-5.png\"><img decoding=\"async\" width=\"752\" height=\"262\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-6-5.png\" alt=\"kod\" class=\"wp-image-16609\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-6-5.png 752w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-6-5-300x105.png 300w\" sizes=\"(max-width: 752px) 100vw, 752px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Zastosowanie var zosta\u0142o ograniczone przez tw\u00f3rc\u00f3w j\u0119zyka Java do zmiennych lokalnych zdefiniowanych w metodach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Poprawne i b\u0142\u0119dne zastosowanie var<\/strong><\/h2>\n\n\n\n<p>Poni\u017cej przyk\u0142ad niew\u0142a\u015bciwego u\u017cycia var na poziomie instancji klasy.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-7-2.png\"><img decoding=\"async\" width=\"596\" height=\"82\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-7-2.png\" alt=\"kod\" class=\"wp-image-16611\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-7-2.png 596w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-7-2-300x41.png 300w\" sizes=\"(max-width: 596px) 100vw, 596px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>W Java var to wci\u0105\u017c konkretny typ, tylko jest on wnioskowany przez kompilator na etapie kompilacji i pozostaje niezmienny w trakcie wykonywania programu.<\/p>\n\n\n\n<p>Poni\u017cej kolejny przyk\u0142ad niew\u0142a\u015bciwego u\u017cycia var.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-8-2.png\"><img decoding=\"async\" width=\"898\" height=\"234\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-8-2.png\" alt=\"kod\" class=\"wp-image-16613\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-8-2.png 898w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-8-2-300x78.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-8-2-768x200.png 768w\" sizes=\"(max-width: 898px) 100vw, 898px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Jak mo\u017cemy zauwa\u017cy\u0107, powy\u017cszy kod nie skompiluje si\u0119, poniewa\u017c programista pr\u00f3buje przypisa\u0107 do zmiennej typu int warto\u015b\u0107, kt\u00f3ra jest \u0142a\u0144cuchem znak\u00f3w. W tym przypadku mamy wi\u0119c do czynienia <strong>z niekompatybilnymi typami.<\/strong><strong><\/strong><\/p>\n\n\n\n<p>Dotychczas u\u017cywali\u015bmy deklaracji zmiennej var w jednej linii, jednak <strong>poprawna jest r\u00f3wnie\u017c deklaracja w wielu liniach.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-9-2.png\"><img decoding=\"async\" width=\"376\" height=\"115\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-9-2.png\" alt=\"kod\" class=\"wp-image-16615\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-9-2.png 376w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-9-2-300x92.png 300w\" sizes=\"(max-width: 376px) 100vw, 376px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na to, i\u017c <strong>deklaracja i inicjalizacja musz\u0105 si\u0119 odby\u0107 w jednej instrukcji<\/strong>. Kod poni\u017cej jest niepoprawny.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-10-2.png\"><img decoding=\"async\" width=\"812\" height=\"177\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-10-2.png\" alt=\"kod\" class=\"wp-image-16617\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-10-2.png 812w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-10-2-300x65.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-10-2-768x167.png 768w\" sizes=\"(max-width: 812px) 100vw, 812px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Poni\u017cszy przyk\u0142ad r\u00f3wnie\u017c si\u0119 <strong>nie skompiluje.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-11-2.png\"><img decoding=\"async\" width=\"847\" height=\"352\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-11-2.png\" alt=\"kod\" class=\"wp-image-16619\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-11-2.png 847w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-11-2-300x125.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-11-2-768x319.png 768w\" sizes=\"(max-width: 847px) 100vw, 847px\" \/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wnioskowanie typu z var<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przyk\u0142ad var i null<\/strong><\/h3>\n\n\n\n<p>Wnioskowanie typu var polega na zdefiniowaniu ogranicze\u0144 dla danego typu i ich odpowiedniej interpretacji w oparciu o zasady opisane w specyfikacji j\u0119zyka Java. Istniej\u0105 jednak przyk\u0142ady, gdzie wnioskowanie typ\u00f3w jest bardziej z\u0142o\u017cone lub niemo\u017cliwe. Rozwa\u017cmy przyk\u0142ad z null<strong>.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-12-1.png\"><img decoding=\"async\" width=\"1024\" height=\"36\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-12-1-1024x36.png\" alt=\"kod\" class=\"wp-image-16621\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-12-1-1024x36.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-12-1-300x11.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-12-1-768x27.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-12-1.png 1368w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>W tym przypadku wnioskowanie typu jest niemo\u017cliwe, poniewa\u017c kompilator na podstawie wyra\u017cenia nie jest w stanie okre\u015bli\u0107 ogranicze\u0144, kt\u00f3re pozwoli\u0142yby mu wykry\u0107 typ. W tym przypadku jedyne mo\u017cliwe rozwi\u0105zanie to <strong>jawne zdefiniowanie typu w postaci rzutowania<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-13-1.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-13-1.png\" alt=\"kod\" class=\"wp-image-16623\" width=\"336\" height=\"22\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-13-1.png 336w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-13-1-300x20.png 300w\" sizes=\"(max-width: 336px) 100vw, 336px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Oczywi\u015bcie taki zapis jest nieczytelny i nie powinien by\u0107 u\u017cywany.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przyk\u0142ad var i wyra\u017cenie lambda<\/strong><\/h3>\n\n\n\n<p>U\u017cycie mechanizmu var z wyra\u017ceniami lambda r\u00f3wnie\u017c mo\u017ce powodowa\u0107 problemy z wnioskowaniem typu. Poni\u017cej niekompiluj\u0105cy si\u0119 przyk\u0142ad z wyra\u017ceniem lambda.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-14.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-14-1024x25.png\" alt=\"kod\" class=\"wp-image-16625\" width=\"840\" height=\"20\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-14-1024x25.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-14-300x7.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-14-768x19.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-14-1536x38.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-14.png 1720w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Przyk\u0142ad var i nowej klasy anonimowej<\/strong><\/h3>\n\n\n\n<p>Jeszcze innym ciekawym przypadkiem dzia\u0142ania mechanizmu var jest poni\u017cszy przyk\u0142ad.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-15.png\"><img decoding=\"async\" width=\"667\" height=\"382\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-15.png\" alt=\"kod\" class=\"wp-image-16627\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-15.png 667w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-15-300x172.png 300w\" sizes=\"(max-width: 667px) 100vw, 667px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Kod przedstawiony powy\u017cej dzia\u0142a i zwraca wyniki: class App3:$1, Hello, 7. W tym przypadku kompilator na podstawie kontekstu i mechanizmu wnioskowania typu utworzy\u0142 now\u0105 klas\u0119 anonimow\u0105 (class App3:$1). W kodzie bajtowym wygenerowanym przez kompilator wygl\u0105da to nast\u0119puj\u0105co.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-16.png\"><img decoding=\"async\" width=\"1024\" height=\"783\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-16-1024x783.png\" alt=\"kod\" class=\"wp-image-16629\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-16-1024x783.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-16-300x229.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-16-768x587.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-16.png 1099w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Var i inicjalizacja tablic<\/strong><\/h3>\n\n\n\n<p>Nale\u017cy r\u00f3wnie\u017c zwr\u00f3ci\u0107 uwag\u0119 na u\u017cycie var z inicjalizacj\u0105 tablic. Poni\u017cej przyk\u0142ad poprawnego zastosowania.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-17.png\"><img decoding=\"async\" width=\"372\" height=\"82\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-17.png\" alt=\"kod\" class=\"wp-image-16631\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-17.png 372w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-17-300x66.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-17-370x82.png 370w\" sizes=\"(max-width: 372px) 100vw, 372px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Przyk\u0142ady niepoprawnego u\u017cycia var z tablicami.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-18.png\"><img decoding=\"async\" width=\"1024\" height=\"85\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-18-1024x85.png\" alt=\"kod\" class=\"wp-image-16633\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-18-1024x85.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-18-300x25.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-18-768x64.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-18.png 1052w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kiedy nie mo\u017cemy u\u017cy\u0107 var?<\/strong><\/h2>\n\n\n\n<p>Nie mo\u017cemy u\u017cywa\u0107 var jako parametru dla metody oraz jako warto\u015bci zwracanej z metody.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-19.png\"><img decoding=\"async\" width=\"392\" height=\"55\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-19.png\" alt=\"kod\" class=\"wp-image-16635\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-19.png 392w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-19-300x42.png 300w\" sizes=\"(max-width: 392px) 100vw, 392px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Podobnie, nie mo\u017cemy stosowa\u0107 var w try-catch.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-20.png\"><img decoding=\"async\" width=\"273\" height=\"91\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-20.png\" alt=\"kod\" class=\"wp-image-16637\"\/><\/a><\/figure><\/div>\n\n\n\n<p>R\u00f3wnie\u017c nie inicjujemy var za pomoc\u0105 method reference.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-21.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-21.png\" alt=\"kod\" class=\"wp-image-16640\" width=\"840\" height=\"21\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-21.png 872w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-21-300x8.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-21-768x19.png 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Zalety i wady zastosowania var<\/strong><\/h2>\n\n\n\n<p>Jak wynika z powy\u017cszych przyk\u0142ad\u00f3w tw\u00f3rcy j\u0119zyka Java musieli na\u0142o\u017cy\u0107 wiele ogranicze\u0144 na obs\u0142ug\u0119 var. Implementacja tego mechanizmu nie jest prosta i mo\u017ce zaskoczy\u0107 programist\u0119, kt\u00f3ry nie jest \u015bwiadomy czyhaj\u0105cych na niego pu\u0142apek.<\/p>\n\n\n\n<p>Nieumiej\u0119tne wykorzystanie var<strong> <\/strong>mo\u017ce r\u00f3wnie\u017c doprowadzi\u0107 do sytuacji, gdy nasz kod b\u0119dzie bardzo trudny do zrozumienia, szczeg\u00f3lnie gdy nie b\u0119dziemy u\u017cywa\u0107 zaawansowanego \u015brodowiska IDE. Z drugiej strony var pozwala upro\u015bci\u0107 kodowanie i powoduje, i\u017c staje si\u0119 ono bardziej zwi\u0119z\u0142e.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dobre praktyki u\u017cywania var<\/strong><\/h2>\n\n\n\n<p>Poni\u017cej znajduje si\u0119 lista zasad i dobrych praktyk, jakie powinny by\u0107 zastosowane w trakcie u\u017cywania var. Lista ta pochodzi z dokumentu <strong>Local Variable Type Inference Style Guidelines<\/strong>, kt\u00f3rego autorem jest Stuart W. Marks. Dokument powsta\u0142 w ramach <strong>projektu Amber<\/strong>. Jego celem by\u0142o dostarczenie mi\u0119dzy innymi obs\u0142ugi var w j\u0119zyku Java.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Czytanie kodu jest wa\u017cniejsze ni\u017c pisanie kodu.<\/strong><\/li><\/ul>\n\n\n\n<p>Zgodnie z t\u0105 zasad\u0105 programi\u015bci przez du\u017c\u0105 cz\u0119\u015b\u0107 czasu czytaj\u0105 kod, a jego zrozumienie jest kluczowe do implementacji nowych funkcjonalno\u015bci lub poprawiania istniej\u0105cych. Pisz\u0105c kod, programista jest odpowiedzialny za u\u017cycie konstrukcji j\u0119zykowych w taki spos\u00f3b, by by\u0142y one zrozumia\u0142e dla innych programist\u00f3w. W skr\u00f3cie w my\u015bl tej zasady zawsze musimy pami\u0119ta\u0107, \u017ce piszemy kod dla innych, a nie dla siebie. U\u017cywaj\u0105c var, powinni\u015bmy szczeg\u00f3lnie zwr\u00f3ci\u0107 uwag\u0119 na to, czy w przysz\u0142o\u015bci kto\u015b b\u0119dzie m\u00f3g\u0142 w spos\u00f3b przejrzysty odczyta\u0107 nasze intencje i czy napisany kod np. nie jest zbyt d\u0142ugi lub u\u017cyte nazwy zmiennych s\u0105 dostatecznie opisowe i przekazuj\u0105 intencje programisty w taki spos\u00f3b, by inny programista m\u00f3g\u0142 \u0142atwo zorientowa\u0107 si\u0119, jakie jest ich przeznaczenie.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Kod powinien by\u0107 \u0142atwy do zrozumienia.<\/strong><\/li><\/ul>\n\n\n\n<p>To za\u0142o\u017cenie wi\u0105\u017ce si\u0119 z pierwszym. Programista, kt\u00f3ry czyta nasz kod, powinien by\u0107 w stanie bardzo szybko go zrozumie\u0107, a u\u017cycie var nie powinno mu w tym przeszkadza\u0107. W idealnym przypadku programi\u015bcie powinien wystarczy\u0107 fragment kodu do zrozumienia jego dzia\u0142ania. Je\u017celi proces zrozumienia kontekstu u\u017cycia zmiennej lokalnej zadeklarowanej jako var wymaga d\u0142u\u017cszej analizy i poruszania si\u0119 po du\u017cej ilo\u015bci kodu, nale\u017cy zastanowi\u0107 si\u0119, czy u\u017cycie var jest prawid\u0142owe.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Czytelno\u015b\u0107 kodu nie powinna zale\u017ce\u0107 od u\u017cywanego IDE.<\/strong><\/li><\/ul>\n\n\n\n<p>Jest to jedno z krytycznych za\u0142o\u017ce\u0144 zwi\u0105zanych z var, poniewa\u017c cz\u0119sto jako programi\u015bci zbytnio polegamy na narz\u0119dziach i stajemy si\u0119 wr\u0119cz ich \u201ezak\u0142adnikami\u201d, zak\u0142adaj\u0105c, \u017ce inni te\u017c b\u0119d\u0105 ich u\u017cywa\u0107 lub u\u017cywaj\u0105 w takim samym stopniu jak my. Programuj\u0105c w okre\u015blonym IDE, pewne rozwi\u0105zania staj\u0105 si\u0119 dla nas tak ewidentne, \u017ce uwa\u017camy, i\u017c s\u0105 one cz\u0119\u015bci\u0105 j\u0119zyka programowania. Z tego powodu zawsze, kiedy piszemy kod, powinni\u015bmy za\u0142o\u017cy\u0107, \u017ce b\u0119dzie on czytany za pomoc\u0105 zwyk\u0142ego edytora tekstowego. W takim wypadku nazwa zmiennej var staje si\u0119 bardzo wa\u017cna, poniewa\u017c musi ona zawiera\u0107 informacje nie tylko o przeznaczeniu zmiennej, ale r\u00f3wnie\u017c o jej typie.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Zastosowanie typ\u00f3w jawnych zale\u017cy od programisty.<\/strong><\/li><\/ul>\n\n\n\n<p>Chocia\u017c typy jawne mog\u0105 by\u0107 bardzo pomocne, czasami nie s\u0105 wa\u017cne, a innym razem po prostu przeszkadzaj\u0105. Niekiedy u\u017cycie jawnego typu powoduje, i\u017c kod zmniejsza swoj\u0105 czytelno\u015b\u0107. Czasami lepiej jest zastosowa\u0107 bardziej opisow\u0105 nazw\u0105 zmiennej ni\u017c u\u017cywa\u0107 deklaracji typu z jej nazw\u0105, kt\u00f3ra cz\u0119sto ju\u017c wskazuje na u\u017cyty typ. I <strong>to za\u0142o\u017cenie jest kluczowe dla wprowadzenia var w j\u0119zyku Java<\/strong>. Jawne definicje typ\u00f3w cz\u0119sto powoduj\u0105 rozproszenie programisty i powoduj\u0105, i\u017c nie mo\u017ce on skupi\u0107 si\u0119 na biznesowym aspekcie, jaki jest realizowany przez okre\u015blony kod.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Wybierz nazwy zmiennych, kt\u00f3re dostarczaj\u0105 przydatnych informacji.<\/strong><\/li><\/ul>\n\n\n\n<p>Jest to praktyka, kt\u00f3ra dotyczy ca\u0142o\u015bci powstaj\u0105cego kodu, jednak <strong>w przypadku u\u017cycia var jest ona szczeg\u00f3lnie wa\u017cna<\/strong>. Programista usuwaj\u0105c informacje o typie, powinien r\u00f3wnie\u017c zastanowi\u0107 si\u0119 nad nazw\u0105 zmiennej, kt\u00f3ra w tym kontek\u015bcie powinna zawiera\u0107 informacje pozwalaj\u0105ce na \u0142atwe zidentyfikowanie roli i typu danej zmiennej. Poni\u017cej przyk\u0142ad przedstawiaj\u0105cy jak wa\u017cna jest nazwa zmiennej zdefiniowanej z pomoc\u0105 var.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-22.png\"><img decoding=\"async\" width=\"497\" height=\"178\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-22.png\" alt=\"kod\" class=\"wp-image-16642\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-22.png 497w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-22-300x107.png 300w\" sizes=\"(max-width: 497px) 100vw, 497px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Widzimy w nim jak trudne mo\u017ce by\u0107 zidentyfikowanie typu zmiennej przez programist\u0119, je\u017celi nie ma on dodatkowych informacji. Czasami dodawanie informacji o typie do nazwy zmiennej jest nadmiarowe i wystarczy nada\u0107 tylko opisow\u0105 nazw\u0119.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-23.png\"><img decoding=\"async\" width=\"496\" height=\"352\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-23.png\" alt=\"\" class=\"wp-image-16644\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-23.png 496w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-23-300x213.png 300w\" sizes=\"(max-width: 496px) 100vw, 496px\" \/><\/a><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Zminimalizuj zasi\u0119g zmiennych lokalnych.<\/strong><\/li><\/ul>\n\n\n\n<p>Programuj\u0105c, powinni\u015bmy unika\u0107 metod zawieraj\u0105cych du\u017ce ilo\u015bci linijek kodu, ale r\u00f3wnie\u017c skutecznie ogranicza\u0107 zasi\u0119g zmiennych lokalnych. Poni\u017cej przyk\u0142ad metody zawieraj\u0105cej du\u017co kodu.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-24.png\"><img decoding=\"async\" width=\"551\" height=\"173\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-24.png\" alt=\"kod\" class=\"wp-image-16646\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-24.png 551w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-24-300x94.png 300w\" sizes=\"(max-width: 551px) 100vw, 551px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Jak mo\u017cemy zauwa\u017cy\u0107, w chwili, gdy nasza metoda zawiera du\u017co kodu i definicja typu jest do\u015b\u0107 \u201edaleko\u201d od miejsca jej u\u017cycia, programista musi wykona\u0107 dodatkowe kroki, by dok\u0142adnie zdefiniowa\u0107, z jakim typem ma do czynienia.&nbsp; Z tego powodu <strong>zasi\u0119g zmiennych <\/strong><strong>var<\/strong><strong> powinien by\u0107 jak najmniejszy.<\/strong><\/p>\n\n\n\n<p>Najlepiej, kiedy programista widzi deklaracje i u\u017cycie na jednym ekranie. Je\u017celi nasza metoda zawiera du\u017co kodu, to lepiej rozwa\u017cy\u0107 jej refaktor na mniejsze fragmenty (metody), zamiast unika\u0107 u\u017cywania zmiennych var.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Rozwa\u017c u\u017cycie var, gdy inicjator dostarcza czytelnikowi wystarczaj\u0105cych informacji.<\/strong><\/li><\/ul>\n\n\n\n<p>Zmienne lokalne s\u0105 cz\u0119sto inicjowane za pomoc\u0105 konstruktor\u00f3w. Nazwa konstruowanej klasy jest zwykle powtarzana jako typ jawny po lewej stronie. Je\u015bli nazwa typu jest d\u0142uga, u\u017cycie var zapewnia zwi\u0119z\u0142o\u015b\u0107 bez utraty informacji.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-25.png\"><img decoding=\"async\" width=\"767\" height=\"120\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-25.png\" alt=\"kod\" class=\"wp-image-16648\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-25.png 767w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-25-300x47.png 300w\" sizes=\"(max-width: 767px) 100vw, 767px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Poprawnym jest r\u00f3wnie\u017c u\u017cycie var w przypadkach, gdy inicjator jest wywo\u0142aniem metody, takiej jak statyczna metoda fabryczna zamiast konstruktora, a jej nazwa zawiera wystarczaj\u0105c\u0105 ilo\u015b\u0107 informacji o typie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-26.png\"><img decoding=\"async\" width=\"627\" height=\"155\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-26.png\" alt=\"kod\" class=\"wp-image-16650\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-26.png 627w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-26-300x74.png 300w\" sizes=\"(max-width: 627px) 100vw, 627px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>W takich przypadkach nazwy metod silnie implikuj\u0105 okre\u015blony typ zwracany, kt\u00f3ry pozwala programi\u015bcie na szybkie okre\u015blenie typu zmiennej.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>U\u017cywaj var do rozdzielenia powi\u0105zanych lub zagnie\u017cd\u017conych wyra\u017ce\u0144.<\/strong><\/li><\/ul>\n\n\n\n<p>Poni\u017cej znajduje si\u0119 fragment kodu, kt\u00f3ry operuje na li\u015bcie zawieraj\u0105cej \u0142a\u0144cuchy znak\u00f3w i faktycznie sk\u0142ada si\u0119 z dw\u00f3ch strumieni wykonywanych jeden po drugim.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-27.png\"><img decoding=\"async\" width=\"743\" height=\"175\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-27.png\" alt=\"kod\" class=\"wp-image-16652\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-27.png 743w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-27-300x71.png 300w\" sizes=\"(max-width: 743px) 100vw, 743px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Jak mo\u017cemy zauwa\u017cy\u0107, aktualna implementacja jest nieczytelna i nieuwa\u017cny programista m\u00f3g\u0142by za\u0142o\u017cy\u0107, i\u017c ma do czynienia z jednym strumieniem. W takim przypadku najlepiej u\u017cy\u0107 var i rozbi\u0107 jeden strumie\u0144 na mniejsze. Poni\u017cej wynik takiego podzia\u0142u.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-28.png\"><img decoding=\"async\" width=\"730\" height=\"173\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-28.png\" alt=\"kod\" class=\"wp-image-16654\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-28.png 730w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-28-300x71.png 300w\" sizes=\"(max-width: 730px) 100vw, 730px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Dodaj\u0105c do tego odpowiednie nazewnictwo, otrzymujemy czytelny i \u0142atwy do zrozumienia kod, kt\u00f3ry jednoznacznie wskazuje na intencje programisty. Jak mo\u017cemy zauwa\u017cy\u0107 na tym przyk\u0142adzie, u\u017cycie var mo\u017ce si\u0119 wi\u0105za\u0107 nie tylko z usuni\u0119ciem informacji o typie, ale tak\u017ce z refaktoringiem kodu.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Nie zwracaj uwagi na interfejsy w zmiennych lokalnych.<\/li><\/ul>\n\n\n\n<p>Jak mogli\u015bmy si\u0119 przekona\u0107 we wcze\u015bniejszych przyk\u0142adach mechanizm wnioskowania typ\u00f3w w j\u0119zyku Java nadaje zmiennym var bezpo\u015bredni typ.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-29.png\"><img decoding=\"async\" width=\"616\" height=\"92\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-29.png\" alt=\"kod\" class=\"wp-image-16656\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-29.png 616w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-29-300x45.png 300w\" sizes=\"(max-width: 616px) 100vw, 616px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Mo\u017cemy zauwa\u017cy\u0107, i\u017c Java nie rozwija typu do jego interfejsu (abstrakcji) \u2013 w tym przyk\u0142adzie do List&lt;String&gt;<string> \u2013 a raczej deklaruje zmienn\u0105 jako typ wynikaj\u0105cy bezpo\u015brednio z przypisania ArrayList&lt;String&gt;<string>. W skr\u00f3cie mo\u017cemy napisa\u0107, i\u017c <strong>Java wi\u0105\u017ce kod z implementacj\u0105, a nie z abstrakcj\u0105.<\/strong><\/string><\/string><\/p>\n\n\n\n<p>Takie stwierdzenie mo\u017ce k\u0142\u00f3ci\u0107 si\u0119 z dobrymi praktykami m\u00f3wi\u0105cymi, i\u017c powinni\u015bmy wi\u0105za\u0107 kod za pomoc\u0105 abstrakcji, by uzyska\u0107 wi\u0119ksz\u0105 elastyczno\u015b\u0107. Jednak jest to prawdziwie za\u0142o\u017cenie dla typ\u00f3w p\u00f3l, typ\u00f3w parametr\u00f3w, metod i typ\u00f3w zwracanych przez metody. W przypadku u\u017cycia lokalnego w metodach ma to mniejsze znaczenie.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Zachowaj ostro\u017cno\u015b\u0107 podczas u\u017cywania var z notacj\u0105 \u201ediamentow\u0105\u201d &lt;&gt; lub typami generycznymi.<\/li><\/ul>\n\n\n\n<p>Skutki u\u017cycia z var z notacj\u0105 \u201ediamentow\u0105\u201d &lt;&gt; ju\u017c by\u0142y przedstawione w tym artykule. Je\u017celi tworzymy zmienn\u0105 var i u\u017cywamy notacji \u201ediamentowej\u201d, automatycznie nie dostarczamy informacji o typie. Za\u0142o\u017ceniem tej notacji jest to, i\u017c informacja o typie jest dostarczona przez lew\u0105 stron\u0119 przypisania, a nie przez praw\u0105. W przypadku var i notacji \u201ediamentowej\u201d nie mamy tej informacji ani po lewej stronie wyra\u017cenia, ani prawej stronie. W takim przypadku Java rozwi\u0105zuje ten typ jako Object<strong>.<\/strong> Przyk\u0142ad poni\u017cej prezentuje zachowanie mechanizmu wnioskowania z wykorzystaniem var i notacji \u201ediamentowej\u201d.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-30.png\"><img decoding=\"async\" width=\"896\" height=\"90\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-30.png\" alt=\"kod\" class=\"wp-image-16658\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-30.png 896w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-30-300x30.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-30-768x77.png 768w\" sizes=\"(max-width: 896px) 100vw, 896px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Innym ciekawym przyk\u0142adem jest ten przedstawiony poni\u017cej.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-31.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-31.png\" alt=\"kod\" class=\"wp-image-16660\" width=\"443\" height=\"18\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-31.png 443w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-31-300x12.png 300w\" sizes=\"(max-width: 443px) 100vw, 443px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>W tym przypadku wnioskowany typ to Object. Wynika to z tego, i\u017c kompilator nie jest w stanie wywnioskowa\u0107 w\u0142a\u015bciwego typu na podstawie kodu.<\/p>\n\n\n\n<p>Poni\u017cej mamy przyk\u0142ad wnioskowania na podstawie argumentu, kt\u00f3ry zosta\u0142 dostarczony do metody, a nast\u0119pnie poprawnie rozwi\u0105zany do typu List&lt;BigInteger&gt;<biginteger>.<\/biginteger><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-32.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-32.png\" alt=\"kod\" class=\"wp-image-16662\" width=\"647\" height=\"26\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-32.png 647w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-32-300x12.png 300w\" sizes=\"(max-width: 647px) 100vw, 647px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Kolejn\u0105 sytuacj\u0119, jak\u0105 mo\u017cemy przeanalizowa\u0107, jest ta przedstawiona poni\u017cej.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-33.png\"><img decoding=\"async\" width=\"711\" height=\"60\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-33.png\" alt=\"kod\" class=\"wp-image-16664\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-33.png 711w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-33-300x25.png 300w\" sizes=\"(max-width: 711px) 100vw, 711px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Jak mo\u017cemy zauwa\u017cy\u0107 w powy\u017cszym przyk\u0142adzie niedostarczenie informacji o typie, skutkuje tym, i\u017c kompilator j\u0119zyka Java przyjmie typ List&lt;Object&gt;<object> \u2013 w momencie, gdy chcemy wymusi\u0107 typ, musimy go jawnie zadeklarowa\u0107.<\/object><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Zachowaj ostro\u017cno\u015b\u0107, u\u017cywaj\u0105c var z litera\u0142ami.<\/li><\/ul>\n\n\n\n<p>Litera\u0142y mog\u0105 by\u0107 u\u017cywane jako inicjatory dla var. U\u017cycie var w takim kontek\u015bcie jest ma\u0142o u\u017cyteczne, ale mo\u017cliwe. Wi\u0119kszo\u015b\u0107 typ\u00f3w, tak jak to zosta\u0142o przedstawione na przyk\u0142adzie poni\u017cej, jest rozwi\u0105zywana poprawnie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-34.png\"><img decoding=\"async\" width=\"472\" height=\"267\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-34.png\" alt=\"kod\" class=\"wp-image-16666\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-34.png 472w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-34-300x170.png 300w\" sizes=\"(max-width: 472px) 100vw, 472px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Nale\u017cy by\u0107 jednak bardzo ostro\u017cnym w momencie, kiedy chcemy u\u017cywa\u0107 var z litera\u0142ami ca\u0142kowitymi. Poni\u017cej przyk\u0142ad, kt\u00f3ry pokazuje mo\u017cliwe konsekwencje takiego przypisania.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-35.png\"><img decoding=\"async\" width=\"377\" height=\"233\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-35.png\" alt=\"kod\" class=\"wp-image-16668\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-35.png 377w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-35-300x185.png 300w\" sizes=\"(max-width: 377px) 100vw, 377px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Litera\u0142y zmiennoprzecinkowe s\u0105 w wi\u0119kszo\u015bci jednoznacznie zdefiniowane.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-36.png\"><img decoding=\"async\" width=\"287\" height=\"177\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-36.png\" alt=\"kod\" class=\"wp-image-16670\"\/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>U\u017cycie var dla deklaracji zmiennych lokalnych mo\u017ce ulepszy\u0107 kod poprzez zwi\u0119kszenie jego czytelno\u015bci w postaci bardziej opisowych nazw. Z drugiej strony bezkrytyczne stosowanie var mo\u017ce pogorszy\u0107 sytuacj\u0119.<\/p>\n\n\n\n<p>U\u017cywany w\u0142a\u015bciwie var mo\u017ce pom\u00f3c ulepszy\u0107 kod, czyni\u0105c go kr\u00f3tszym i bardziej przejrzystym, bez uszczerbku dla jego zrozumienia.<\/p>\n\n\n\n<p>Podstawowym kryterium, jakie programista powinien rozwa\u017cy\u0107 przy u\u017cyciu var, jest czytelno\u015b\u0107 kodu i jego zrozumienie przez innych programist\u00f3w<em>.<\/em><\/p>\n\n\n\n<p>U\u017cycie var w kodzie istniej\u0105cym zawsze powinno by\u0107 poprzedzone analiz\u0105 skutk\u00f3w takiej zmiany oraz wykonaniem odpowiedniego refaktoringu. Wa\u017cnym elementem u\u017cycia var jest odpowiednie zdefiniowanie zmiennej, tak by kompilator mia\u0142 mo\u017cliwo\u015b\u0107 wywnioskowa\u0107 w\u0142a\u015bciwy typ.<\/p>\n\n\n\n<p>Ostatni przyk\u0142ad pokazuje r\u00f3\u017cnic\u0119 w czytelno\u015bci kodu z u\u017cyciem var i bez.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-37.png\"><img decoding=\"async\" width=\"846\" height=\"272\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-37.png\" alt=\"kod\" class=\"wp-image-16672\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-37.png 846w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-37-300x96.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Ryc.-37-768x247.png 768w\" sizes=\"(max-width: 846px) 100vw, 846px\" \/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Literatura<\/strong><\/h2>\n\n\n\n<p>Inspiracj\u0105 do napisania powy\u017cszego artyku\u0142u by\u0142y artyku\u0142y przedstawione poni\u017cej \u2013 szczeg\u00f3lnie artyku\u0142 <strong>Braiana Goetza<\/strong>.<\/p>\n\n\n\n<p>Celem powy\u017cszego artyku\u0142u jest zebranie wa\u017cnych informacji na temat u\u017cycia mechanizmu <strong>Local Variable Type Interfacje<\/strong> w jednym miejscu oraz dodanie dodatkowych informacji, kt\u00f3rych cz\u0119sto brakuje w innych artyku\u0142ach \u2013 mianowicie spojrzenie z punktu widzenia wygenerowanego kodu bajtowego, co w mojej ocenie pozwala na lepsze zrozumienie tego mechanizmu.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.infoq.com\/articles\/java-local-variable-type-inference\/\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Java Feature Spotlight: Local Variable Type Inference<\/a><\/li><li><a href=\"https:\/\/github.com\/openjdk\/amber-docs\/blob\/master\/site\/guides\/lvti-style-guide.md\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Local Variable Type Inference<\/a><\/li><li><a href=\"https:\/\/www.baeldung.com\/java-10-local-variable-type-inference\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Java 10 LocalVariable Type-Inference<\/a><\/li><li><a href=\"https:\/\/howtodoinjava.com\/java10\/var-local-variable-type-inference\/\" rel=\"nofollow\" >Java var \u2013 Local-Variable Type Inference<\/a><\/li><li><a href=\"https:\/\/javarevisited.blogspot.com\/2018\/03\/finally-java-10-has-var-to-declare-local-variables.html#axzz7YNnTYGX1\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Javarevisited<\/a><\/li><li><a href=\"https:\/\/www.infoq.com\/articles\/java-10-var-type\/\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Explore the New Java 10 \u201cvar\u201d Type: An Introduction and Hands-on Tutorial<\/a><\/li><li><a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se13\/html\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >The Java\u00ae Language Specification, Java SE 13 Edition<\/a><\/li><\/ul>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 tematyka Java i JavaScript, to zach\u0119camy do zapoznania si\u0119 z innymi artyku\u0142ami naszych ekspert\u00f3w np. <a href=\"https:\/\/sii.pl\/blog\/wyrazenie-lambda-w-javie\/?category=development-na-twardo&amp;tag=java,software-development,wyrazenie-lambda\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Wyra\u017cenie lambda w Javie\">Wyra\u017cenie lambda w Javie<\/a> oraz<a href=\"what stands behind most video conferencing software? Setting up a simple connection with JavaScript\/Kotlin.\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" > WebRTC: what stands behind most video conferencing software? Setting up a simple connection with JavaScript\/Kotlin. <\/a><\/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;16597&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;7&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&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;5\\\/5 ( votes: 7)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Local Variable Type Inference (var) w Java 10&quot;,&quot;width&quot;:&quot;139.5&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: 139.5px;\">\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            5\/5 ( votes: 7)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Jedn\u0105 z nowo\u015bci wprowadzonych w j\u0119zyku Java w wersji 10 jest mechanizm okre\u015blany jako Local Variable Type Inference, w skr\u00f3cie &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/local-variable-type-inference-var-w-java-10\/\">Continued<\/a><\/p>\n","protected":false},"author":421,"featured_media":19719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":10,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1556,825,330],"class_list":["post-16597","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-var","tag-dobre-praktyki","tag-java"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/10\/Local-Variable-Type-Inference-var-w-Java-10.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16597"}],"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\/421"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=16597"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16597\/revisions"}],"predecessor-version":[{"id":19721,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/16597\/revisions\/19721"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19719"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=16597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=16597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=16597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}