<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rekrutacja - bdabek.pl</title>
	<atom:link href="https://www.bdabek.pl/tag/rekrutacja/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bdabek.pl/tag/rekrutacja/</link>
	<description>Bartosz Dąbek</description>
	<lastBuildDate>Tue, 29 Sep 2020 06:07:43 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.bdabek.pl/wp-content/uploads/2020/10/cropped-5986134a-46ba-41ac-9c82-bb4ffb3a7bf3_200x200-1-150x150.png</url>
	<title>Rekrutacja - bdabek.pl</title>
	<link>https://www.bdabek.pl/tag/rekrutacja/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Zadanie rekrutacyjne 🤫 [MID] – TDD 🤷‍♂️❓</title>
		<link>https://www.bdabek.pl/pytania-rekrutacyjne-mid-02/</link>
					<comments>https://www.bdabek.pl/pytania-rekrutacyjne-mid-02/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 29 Feb 2020 11:00:20 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Rekrutacja]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=399</guid>

					<description><![CDATA[<p>Cześć. Dziś przedstawię Ci temat o którym wspominałem 2 tygodnie temu tutaj &#8211; czyli zadanie praktyczne jakie dostałem na rozmowie rekrutacyjnej. Treść zadania brzmiała mniej więcej tak: Tu masz interfejs, tu jest klasa z testami, zaimplementuj to tak żeby testy przechodziły. Ogólnie chodziło o to aby napisać implementację która zlicza częstotliwość wystąpienia danego znaku w wyrazie&#8230;&#160;<a href="https://www.bdabek.pl/pytania-rekrutacyjne-mid-02/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Zadanie rekrutacyjne 🤫 [MID] – TDD 🤷‍♂️❓</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/pytania-rekrutacyjne-mid-02/">Zadanie rekrutacyjne 🤫 [MID] – TDD 🤷‍♂️❓</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Cześć. Dziś przedstawię Ci temat o którym wspominałem 2 tygodnie temu <strong><a href="https://www.bdabek.pl/pytania-rekrutacyjne-mid-01/" target="_blank" rel="noopener noreferrer">tutaj</a></strong> &#8211; czyli <strong>zadanie praktyczne jakie dostałem na rozmowie rekrutacyjnej</strong>.</p>
<hr />
<p><strong>Treść zadania</strong> brzmiała mniej więcej tak: <em>Tu masz interfejs, tu jest klasa z testami, zaimplementuj to tak żeby testy przechodziły</em>. Ogólnie chodziło o to aby napisać implementację która zlicza częstotliwość wystąpienia danego znaku w wyrazie i zwracać to jako mapę <strong>Map&lt;Character, Double&gt;</strong>, np:</p>
<ul>
<li><strong>a</strong> -&gt; map.get(a) -&gt; <strong>1</strong></li>
<li><strong>ab</strong> -&gt; map.get(a) -&gt; <strong>0.5</strong> / map.get(b) -&gt; <strong>0.5</strong></li>
<li><strong>aaa</strong> -&gt; map.get(a) -&gt; <strong>1</strong></li>
<li><strong>AaA</strong> -&gt; map.get(a) -&gt; <strong>1</strong></li>
<li><strong>abcd</strong> -&gt; map.get(a) -&gt; <strong>0.25</strong></li>
</ul>
<p><strong><em>Interfejs:</em></strong></p><pre class="crayon-plain-tag">public interface Frequency {
    Map&lt;Character, Double&gt; analyze(String analyze);
}</pre><p><em><strong>Klasa testowa: </strong></em><a href="https://gist.github.com/BartoszDabek/8b96279d2c6ccc4fd7da51f890a2b58b" target="_blank" rel="noopener noreferrer">(gist)</a></p><pre class="crayon-plain-tag">class FrequencyTest {

    private Frequency frequency;

    @BeforeEach
    void setUp() {
        frequency = getFrequency();
    }

    @Test
    void should_return_1_for_single_character() {
        Map&lt;Character, Double&gt; result = frequency.analyze("a");

        assertEquals(1.0, result.get('a'));
    }

    @Test
    void should_return_half_when_two_different_characters() {
        Map&lt;Character, Double&gt; result = frequency.analyze("ab");

        assertEquals(0.5, result.get('a'));
        assertEquals(0.5, result.get('b'));
    }

    @Test
    void should_return_1_for_the_same_character() {
        Map&lt;Character, Double&gt; result = frequency.analyze("aaa");

        assertEquals(1.0, result.get('a'));
    }

    @Test
    void should_return_even_half_when_two_different_characters() {
        Map&lt;Character, Double&gt; result = frequency.analyze("aab");

        assertEquals(0.5, result.get('a'));
        assertEquals(0.5, result.get('b'));
    }

    @Test
    void should_return_even_half_when_different_characters() {
        Map&lt;Character, Double&gt; result = frequency.analyze("abcd");

        assertEquals(0.25, result.get('a'));
        assertEquals(0.25, result.get('b'));
        assertEquals(0.25, result.get('c'));
        assertEquals(0.25, result.get('d'));
    }

    @Test
    void should_return_1_for_the_same_character_with_Upper_And_Lower_case() {
        Map&lt;Character, Double&gt; result = frequency.analyze("AaA");

        assertEquals(1.0, result.get('a'));
    }

    @Test
    void should_return_even_half_when_different_characters_occurs_few_times() {
        Map&lt;Character, Double&gt; result = frequency.analyze("aaaAbcdd");

        assertEquals(0.25, result.get('a'));
        assertEquals(0.25, result.get('b'));
        assertEquals(0.25, result.get('c'));
        assertEquals(0.25, result.get('d'));
    }

    @Test
    void should_throw_exception_when_null_input() {
        assertThrows(IllegalArgumentException.class, () -&gt; frequency.analyze(null));
    }

    private Frequency getFrequency() {
        return null;
    }
}</pre><p>Jeżeli chodzi o samą klasę testową to nie zapamiętałem wszystkich testów jakie tam były (+ ich nazw dokładnie 1 do 1), tutaj przedstawiam większą i ważniejszą część którą zapamiętałem.</p>
<hr />
<p><b style="font-size: 35px;">1.</b> Pierwszym krokiem jaki zrobiłem było utworzenie klasy implementującej nasz interfejs oraz zwrócenie go w teście. Nie miałem pomysłu na nazwę więc poleciała pierwsza lepsza jaka mi przychodziła do głowy <strong><em>FrequencyImpl</em></strong>. Teraz jak na nią patrzę to na pewno dałbym inną, np. <strong><em>FrequencyAnalyzer</em> </strong>albo <strong><em>FrequencyCharacterAnalyzer</em></strong>.</p><pre class="crayon-plain-tag">private Frequency getFrequency() {
    return new FrequencyImpl();
}</pre><p><strong>Zgodnie z TDD</strong> pierwsze testy uruchomiłem od razu po utworzeniu domyślnej implementacji. Oczywiście wszystkie zakończyły się błędem <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ale o to chodzi w TDD &#8211; <strong>krótka i szybka pętla zwrotna</strong>. Następnie, czas na spełnienie pierwszego testu &#8211; rozwiązałem to tak, że stworzyłem mapę i na sztywno wpisałem wartość jaka ma być zwracana &#8211; czy to była dobra decyzja? I tak i nie. Tak, bo miałem znów bardzo szybki zwrot z informacją, że pierwszy test się udał a nie bo wiedziałem, że za chwilę i tak to zmienię więc czy dla spełniego takiego testu jest sens pisać tak <strong>PROSTĄ IMPLEMENTACJĘ??</strong> W moim odczuciu &#8211; tak, z uwagi na pętlę zwrotną z feedbackiem że coś działa + o to właśnie chodzi w TDD &#8211; piszemy coś najprościej jak się da a później refaktorujemy, weryfikując że testy nadal przechodzą.</p><pre class="crayon-plain-tag">@Override
public Map&lt;Character, Double&gt; analyze(String text) {
    Map&lt;Character, Double&gt; characterFrequency = new HashMap&lt;&gt;();
    characterFrequency.putIfAbsent(text.charAt(0), 1.0);
    return characterFrequency;
}</pre><p>No i dobra. Pierwszy test zaliczony, czas przejść do drugiego.</p>
<p><b style="font-size: 35px;">2.</b> Mamy zwracać równe połówki gdy jako wejście dostaliśmy dwa różne znaki. Właściwie nie trzeba się nad tym za długo zastanawiać jeżeli chcemy osiągnąć cel jak najprostszym i najszybszym sposobem. Możemy wyciągnąć tablicę znaków z naszego inputa a później po niej iterować. Każdy napotkany znak wsadzamy do mapy, gdzie jako wartość robimy proste obliczenie arytmetyczne dzieląc 1 przez ilość znaków.</p><pre class="crayon-plain-tag">@Override
public Map&lt;Character, Double&gt; analyze(String text) {
    Map&lt;Character, Double&gt; characterFrequency = new HashMap&lt;&gt;();
    char[] chars = text.toCharArray();
    for (int i = 0; i &lt; chars.length; i++) {
        characterFrequency.putIfAbsent(text.charAt(i), 1.0 / chars.length);
    }
    return characterFrequency;
}</pre><p>Do tej pory wszystko było git. Ale teraz zaczęły się schody. I to takie których <strong>nie przeszedłem</strong> &#8211; właściwie nie wiem dlaczego.. chyba za bardzo się zestresowałem takim live codingiem. Bo żeby nie było &#8211; do wszystkiego co pisałem często były zadawane pytania &#8211; <em>dlaczego tak, a po co to? </em>No nieważne&#8230; jesteśmy przy drugim teście odpalamy i jest zielono (przy pierwszym i drugim teście) &#8211; lecimy do kolejnego.</p>
<p><b style="font-size: 35px;">3.</b> Mamy ignorować powtórzenia, czyli w świecie baz danych musimy zrobić <em>distinct </em>na naszym wejściowym stringu. Potencjalnie można ten test rozwiązać na kilka sposobów a najprostszy z nich wyglądałby tak, że robimy 2 oddzielne pętle. W pierwszej wsadzamy elementy do mapy, pamiętając, że <strong>mapa w kluczu nie przechowuje duplikatów </strong>(tutaj jako wartość możemy wsadzić dowolny element będący doublem &#8211; nie ważne czy to będzie prawidłowa wartość czy nie), w drugiej natomiast (wiedząc, że nasza mapa zawiera unikatowe klucze &#8211; czyt. zrobiła distinct na stringu wejściowym) wsadzamy wartości do mapy raz jeszcze &#8211; tym razem przypisując każdemu znakowi wejściowemu prawidłową wartość &#8211; czyli dzieląć 1 przez wielkość mapy.</p><pre class="crayon-plain-tag">@Override
public Map&lt;Character, Double&gt; analyze(String text) {
    Map&lt;Character, Double&gt; characterFrequency = new HashMap&lt;&gt;();
    char[] chars = text.toCharArray();
    for (int i = 0; i &lt; chars.length; i++) {
        characterFrequency.putIfAbsent(text.charAt(i), 0.0);
    }
    for (Character character : characterFrequency.keySet()) {
        characterFrequency.put(character, 1.0 / characterFrequency.size());
    }
    return characterFrequency;
}</pre><p>Gdybym tak to zrobił, miałbym zaliczony test 3, 4 i 5.</p>
<p><b style="font-size: 35px;">4.</b> Ingorujemy małe i wielkie znaki. Najprostsze rozwiązanie? Na całym wejściowym stringu robimy <em><strong>.toLowerCase()</strong></em>.</p><pre class="crayon-plain-tag">@Override
public Map&lt;Character, Double&gt; analyze(String text) {
    Map&lt;Character, Double&gt; characterFrequency = new HashMap&lt;&gt;();
    text = text.toLowerCase();
    ...
}</pre><p>Testy 6 i 7 zaliczone.</p>
<p><b style="font-size: 35px;">5.</b> Ostatni test do zaliczenia. Bardzo prosty &#8211; wystarczy dodać obsługę wartości nullowej na wejściu. Końcowo nasza implementacja wygląda tak:</p><pre class="crayon-plain-tag">@Override
public Map&lt;Character, Double&gt; analyze(String text) {
    if (text == null) {
        throw new IllegalArgumentException();
    }
    Map&lt;Character, Double&gt; characterFrequency = new HashMap&lt;&gt;();
    text = text.toLowerCase();
    char[] chars = text.toCharArray();
    for (int i = 0; i &lt; chars.length; i++) {
        characterFrequency.putIfAbsent(text.charAt(i), 0.0);
    }
    for (Character character : characterFrequency.keySet()) {
        characterFrequency.put(character, 1.0 / characterFrequency.size());
    }
    return characterFrequency;
}</pre><p><strong>Wszystkie testy przechodzą. </strong>Zadanie zaliczone. I tutaj każdy <strong>kto pracuje z TDD</strong> powinien powiedzieć hola hola amigos <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f452.png" alt="👒" class="wp-smiley" style="height: 1em; max-height: 1em;" />!! Chyba brakuje jeszcze jakiejś fazy. Właściwie to powinna ona być robiona po każdym z zaliczonych testów &#8211; tzn. <strong style="font-size: 30px;">refactoring</strong>. Niestety na rozmowie nie udało mi się dojść do tego etapu, jednak tutaj zaprezentuję rozwiązanie jakie byłbym w stanie wrzucić na review gdybym mógł pomyśleć o tym zadaniu na chłodno.</p>
<p><em><strong>Ostateczne rozwiązanie: </strong></em><a href="https://gist.github.com/BartoszDabek/6e3994e8c4358e608c3f891aaeffaa8f" target="_blank" rel="noopener noreferrer">(gist)</a></p><pre class="crayon-plain-tag">@Override
public Map&lt;Character, Double&gt; analyze(String text) {
    if (text == null) {
        throw new IllegalArgumentException();
    }
    text = text.toLowerCase();
    Map&lt;Character, Double&gt; characterFrequency = new HashMap&lt;&gt;();
    long distintChars = text.chars().distinct().count();
    for (Character character: text.toCharArray()) {
        characterFrequency.putIfAbsent(character, 1.0 / distintChars);
    }
    return characterFrequency;
}</pre><p></p>
<hr />
<p>Tak to wyglądało. Trudne, łatwe? Powiedziałbym &#8211; takie przeciętne. Myślę, że w tym zadaniu chodziło o sprawdzenie kilku aspektów:</p>
<ol>
<li><strong>Znajomość i umiejętność pracy z TDD</strong></li>
<li><strong>Znajomość API Javy</strong></li>
<li><strong>Umiejętność logicznego myślenia</strong></li>
<li><strong>Radzenie sobie ze stresem</strong></li>
</ol>
<p>Daj znać w komentarzu <b style="font-size: 30px;">co byś napisał inaczej</b> (<strong>jak wyglądałoby Twoje ostateczne rozwiązanie</strong>)<strong>? </strong>A może sam czasem przeprowadzasz rozmowy rekrutacyjne to co byś dodał do tego zadania? Z chęcią będę aktualizował ten post &#8211; a nóż widelec może przyda Ci się to zadanko przy prowadzeniu przyszłej rozmowy rekrutacyjnej&#8230; <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<hr />
<p>Tyle na dziś. Dzięki bardzo za przeczytanie. <strong>Za tydzień</strong> &#8211; standardowo, <strong>w sobotę o 12</strong> &#8211;  <em style="font-size: 25px; color: red;">obsługa VIMa dla każdego.</em> <em style="font-size: 25px;">Czyli w 5 minut naucz się tego dziwnego edytora!</em></p>
<p>Artykuł <a href="https://www.bdabek.pl/pytania-rekrutacyjne-mid-02/">Zadanie rekrutacyjne 🤫 [MID] – TDD 🤷‍♂️❓</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/pytania-rekrutacyjne-mid-02/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Pytania rekrutacyjne 🤫 [MID] &#8211; Prymitywy-Wrappery-Obiekty 🤷‍♂️❓</title>
		<link>https://www.bdabek.pl/pytania-rekrutacyjne-mid-01/</link>
					<comments>https://www.bdabek.pl/pytania-rekrutacyjne-mid-01/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 15 Feb 2020 11:00:46 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Rekrutacja]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=313</guid>

					<description><![CDATA[<p>Hej. Byłem ostatnio na rozmowie rekrutacyjnej i myślę, że warto podzielić się tu moim doświadczeniem. Na początku zaznaczę, że była to rozmowa na stanowisko Java Developera &#8211; stricte Java &#8211; nie padały pytania o frameworki. Rekruterzy skupili się na pytaniach wymuszających logiczne myślenie (no kto by się spodziewał) i dopytywali się o wiedzę odnośnie core&#8217;owych&#8230;&#160;<a href="https://www.bdabek.pl/pytania-rekrutacyjne-mid-01/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Pytania rekrutacyjne 🤫 [MID] &#8211; Prymitywy-Wrappery-Obiekty 🤷‍♂️❓</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/pytania-rekrutacyjne-mid-01/">Pytania rekrutacyjne 🤫 [MID] &#8211; Prymitywy-Wrappery-Obiekty 🤷‍♂️❓</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Hej. Byłem ostatnio na rozmowie rekrutacyjnej i myślę, że warto podzielić się tu moim doświadczeniem. Na początku zaznaczę, że była to rozmowa na stanowisko <strong>Java Developera</strong> &#8211; stricte Java &#8211; <strong>nie padały pytania o frameworki</strong>. Rekruterzy skupili się na pytaniach wymuszających logiczne myślenie (no kto by się spodziewał) i dopytywali się o wiedzę odnośnie core&#8217;owych elementów Javy &#8211; co, jak i dlaczego. Nawiasem mówiąc bardzo podobał mi się taki styl prowadzenia rekrutacji.</p>
<p>Jeszcze słowo odnośnie nietechnicznych aspektów. Rozmowa była prowadzona przez 2 developerów (tech leadów) i trwała około 2 godzin. Zaoferowali mi całkiem fajną ofertę ale niestety nie godzili się na pracę zdalną w 100% więc się nie dogadaliśmy.</p>
<p>Z tej rozmowy na bloga chcę przelać jedno z ciekawszych <strong>pytań</strong> jakie padło i jedno <strong>zadanie</strong> jakie musiałem wykonać robiąc live-coding (btw. poległem na tym zadaniu bardzo bardzo&#8230;). Pytanie opiszę w tym artykule a zadanie pojawi się za dwa tygodnie w sobotę.</p>
<hr />
<p>Ok&#8230; o co chodzi z tym pytaniem? <em>Prymitywy-Wrappery-Obiekty <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f937-200d-2642-fe0f.png" alt="🤷‍♂️" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2753.png" alt="❓" class="wp-smiley" style="height: 1em; max-height: 1em;" /></em>. Miałem przedstawiony następujący kawałek kodu</p><pre class="crayon-plain-tag">public class Decrementer {
    private void decrement(double x) {
        x = x - 1.0;
    }
    public static void main(String[] args) {
        double x = 12.3;
        Decrementer decrementer = new Decrementer();
        decrementer.decrement(x);
        System.out.println(x);
    }
}</pre><p>I dostałem pytanie: <em>Co zostanie wypisane na ekranie?</em></p>
<ul>
<li><em>a) 12.3</em></li>
<li><em>b) 0</em></li>
<li><em>c) 11.3</em></li>
</ul>
<p>Pytanie raczej z gatunków proste &#8211; btw. zanim przeczytasz dalej, sam na nie odpowiedz (albo napisz w komentarzu, żeby dać mi satysfakcję że nie piszę do ściany). Szybka analiza kodu i wiedza, że Java działa <a href="https://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value" target="_blank" rel="noopener noreferrer">pass-by-value</a> daje nam oczywiście odpowiedź <strong>a) 12.3</strong>.<img fetchpriority="high" decoding="async" class="size-full wp-image-322 aligncenter" src="https://www.bdabek.pl/wp-content/uploads/2020/02/java-pass-by-value-or-reference.png" alt="" width="824" height="178" srcset="https://www.bdabek.pl/wp-content/uploads/2020/02/java-pass-by-value-or-reference.png 824w, https://www.bdabek.pl/wp-content/uploads/2020/02/java-pass-by-value-or-reference-300x65.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/02/java-pass-by-value-or-reference-768x166.png 768w" sizes="(max-width: 824px) 100vw, 824px" /></p>
<p>A teraz pytanie co się stanie jak kod zmienimy w następujący sposób? <em>(zmiana prymitywów na Double)</em></p><pre class="crayon-plain-tag">public class Decrementer {
    private void decrement(Double x) {
        x = x - 1.0;
    }
    public static void main(String[] args) {
        Double x = 12.3;
        Decrementer decrementer = new Decrementer();
        decrementer.decrement(x);
        System.out.println(x);
    }
}</pre><p>Java działa pass-by-value ale jeżeli przesyłamy obiekt i modyfikujemy coś w nim (najczęściej przez settery) to stan obiektu powinien się zmienić nawet po wyściu z metody, tak? To takie trochę pytanie retoryczne bo odpowiedź brzmi <strong>TAK</strong>. Więc co teraz? Jaka będzie odpowiedź? &#8230;. &lt;chwilka na namysł&gt;. Ponownie prawidłową odpowiedzią jest <strong>a) 12.3</strong>. Dlaczego? Jeżeli nie wiesz (ja się na tym wywaliłem, bo nie wiedziałem co tak naprawdę robi wrapper double&#8217;a) to spójrz na linię 3. Nie używamy tu żadnego setter&#8217;a do zmiany stanu obiektu, używamy tylko znaku przypisania <em>=</em>. Ba&#8230; więcej. Zajrzyjmy do klasy Double i zobaczmy jakie metody są tu dostępne.</p>
<p><img decoding="async" class="size-full wp-image-328 aligncenter" src="https://www.bdabek.pl/wp-content/uploads/2020/02/Double-methods.png" alt="" width="699" height="674" srcset="https://www.bdabek.pl/wp-content/uploads/2020/02/Double-methods.png 699w, https://www.bdabek.pl/wp-content/uploads/2020/02/Double-methods-300x289.png 300w" sizes="(max-width: 699px) 100vw, 699px" /></p>
<p>Widzisz jakieś metody do zmiany stanu wewnętrznej zmiennej (value)? <strong>Raczej nie i nie szukaj bo nie znajdziesz</strong>. Wszystkie wrappery zostały celowo zaprojektowane tak aby nie dało się zmienić ich stanu wewnętrznego. Dlaczego? Taką decyzję projektową podjęły osoby, które to implementowały &#8211; nie ma na to jasnej odpowiedzi. Jednym z plusów takiego rozwiązania jest na pewno to, że możemy działać bezpiecznie z wieloma wątkami dzięki temu, że klasa jest niemutowalna. Więc co tak naprawdę się stało, że mimo wszystko przypisanie do zmiennej x, która była typu <em>Double</em> zadziałało wewnątrz metody i że po wyjściu z tej metody mieliśmy tę samą wartość co poprzednio? &lt;Dzięki <b class="fn">Cepewka</b>&gt; Zadziałał tu wcześniej wspominany mechanizm pass-by-value i bardzo polecam prześledzić sobie dokładnie <a href="https://stackoverflow.com/a/12429953/7252927" target="_blank" rel="noopener noreferrer">tą odpowiedź na stackoverflow</a>, która fajnie obrazkowo pokazuje dlaczego to działa właśnie w ten sposób. I nie ma to znaczenia czy prześlemy tu obiekt wrapujący czy jakikolwiek inny. <del><a href="https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html" target="_blank" rel="noopener noreferrer">Autoboxing i Unboxing</a>, czyli automatyczna konwersja, której dokonuje kompilator Javy dzięki czemu my &#8211; developerzy &#8211; mamy czystszy kod. Dla bardziej dociekliwych &#8211; oto jak wygląda byte code metody decrement</del></p><pre class="crayon-plain-tag">0 aload_1
 1 invokevirtual #2 &lt;java/lang/Double.doubleValue&gt;
 4 dconst_1
 5 dsub
 6 invokestatic #3 &lt;java/lang/Double.valueOf&gt;
 9 astore_1
10 return</pre><p><del>To co nas interesuje to linie 1 (unboxing) i linia 6 (autoboxing). Jak widzisz pomimo tego, że wysyłaliśmy <em>Double&#8217;a</em> to jednak kompilator pod spodem robi trochę niewidocznej roboty&#8230; Nasza wartość została na początku skonwertowana do typu prymitywnego (<em>java/lang/Double.doubleValue</em>), następnie została wykonana operacja odejmowania i z powrotem dostajemy klasę wrapującą (<em>java/lang/Double.valueOf</em>). Myślę, że warto wiedzieć takie rzeczy&#8230; prędziej lub później (w moim przypadku później :D) :).</del></p>
<p>Jeżeli chodzi o pytania z rozmowy odnośnie tego zagadnienia to właściwie na tym się skończyło. Po tym jak poległem z brakiem mojej wiedzy o klasach wrapujących, myślę, że rekruterzy nie do końca chcieli ciągnąć ten wagonik. Jednak wydaje mi się, że mogłoby tu się pojawić pytanie, co zrobić, żeby móc zmodyfikować stan tego obiektu. I można tu udzielić dwóch odpowiedzi. Pierwsza to oczywiście zwracać wartość z metody i przypisywać ją do nowej zmiennej. Druga opcja to dodanie pola do klasy <em>Decrement</em> przechowującego wartość i modyfikowanie tego pola w ramach metody decrement a następnie odwoływanie się do niego w metodzie wypisującej wynik na ekran (tylko trzeba pamiętać, że to już nie jest thread-safe). O coś takiego</p><pre class="crayon-plain-tag">public class Decrementer {
    Double x;
    private void decrement(Double x) {
        this.x = x - 1.0;
    }
    public static void main(String[] args) {
        Double x = 12.3;
        Decrementer decrementer = new Decrementer();
        decrementer.decrement(x);
        System.out.println(decrementer.x);
    }
}</pre><p></p>
<hr />
<p>To na tyle w tym tygodniu :). Dzięki za przeczytanie i standardowo zapraszam <strong>za tydzień o 12:00</strong> (sobota), gdzie pojawi się wpis o <strong>najbardziej przydatnych</strong> (moim zdaniem) <strong>skrótach klawiszowych do <a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener noreferrer">IntelliJ</a></strong>.</p>
<p>Artykuł <a href="https://www.bdabek.pl/pytania-rekrutacyjne-mid-01/">Pytania rekrutacyjne 🤫 [MID] &#8211; Prymitywy-Wrappery-Obiekty 🤷‍♂️❓</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/pytania-rekrutacyjne-mid-01/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
