<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEIFRHs8cSp7ImA9WhRaE0o.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200</id><updated>2012-02-16T08:15:15.579+01:00</updated><category term="mocks" /><category term="calendar" /><category term="Mockito" /><category term="reflection" /><category term="enum" /><category term="wrapper" /><category term="swing" /><category term="unittest" /><category term="google guava" /><category term="trådar" /><category term="mock" /><category term="joshua bloch" /><category term="fabriksmetod" /><category term="enhetstester" /><category term="arbetsprov" /><category term="date" /><category term="Java" /><category term="joda-time" /><category term="gui" /><category term="enhetstest" /><category term="rekrytering" /><category term="switch" /><category term="datum" /><category term="awt" /><category term="test" /><category term="design pattern" /><category term="google mockito" /><category term="designmönster" /><category term="fabrik" /><category term="google collections" /><category term="testramverk" /><category term="adapter" /><category term="tid" /><category term="effective java" /><category term="boktips" /><category term="attrapper" /><category term="datetime" /><category term="enums" /><title>Javatankar</title><subtitle type="html">En blogg på ren svenska om tankar kring utveckling i allmänhet och Java i synnerhet.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.javatankar.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.javatankar.com/" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Javatankar" /><feedburner:info uri="javatankar" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DUIHSXc5eip7ImA9WhRVGEo.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-6238634830419117637</id><published>2012-01-18T10:05:00.000+01:00</published><updated>2012-01-18T10:05:38.922+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-18T10:05:38.922+01:00</app:edited><title>Wikipedias nersläckning och risken med klientkod</title><content type="html">Idag är engelska &lt;a href="http://en.wikipedia.org/"&gt;wikipedia&lt;/a&gt; nerstängd i protest mot ett par amerikanska lagförslag. Sättet de släckt ner på påminner mig om riskerna med klientkod - kod som körs på klientsidan riskerar i princip alltid att manipuleras. Jag noterade att orginalsidan snabbt blinkar till innan den blockeras av meddelandet om nedstängning. En snabb undersökning av sidans struktur visar att det wikipedia har gjort är att sätta synlighetsegenskapen hos innehållet till osynligt. Den som vill se innehåller kan välja att modifiera denna egenskap till att den skall visas. Detta kan till exempel göras genom att exekvera javascript i addressfältet (en relativt okänd möjlighet) enligt nedan:&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;javascript:alert(content.style.setProperty("display", "inline"));&lt;/code&gt;&lt;/pre&gt;
Det första &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;javascript:&lt;/span&gt; som kommer först talar om att det är javascript som följer (jämför med &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;http: &lt;/span&gt;etc), sedan använder jag ett anrop till &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;alert()&lt;/span&gt; för att förhindra att resultatet av körningen visas i en ny sida vilket skulle motverka syftet. Sist sätter jag om synlighetsegenskapen till inline, och voila!&lt;br /&gt;
&lt;br /&gt;
Jag surfar med Safari där jag testat skriptet. Samma teknik funkar i andra browsers också, men det &lt;i&gt;kan&lt;/i&gt; skilja i detaljer. Kommentera gärna vilka andra browsers det fungerar på.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-6238634830419117637?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V0a5pQL92iFiexzgMhnNC2SwLts/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V0a5pQL92iFiexzgMhnNC2SwLts/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V0a5pQL92iFiexzgMhnNC2SwLts/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V0a5pQL92iFiexzgMhnNC2SwLts/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/F2sQHW7OWSQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/6238634830419117637/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/wikipedias-nerslackning-och-risken-med.html#comment-form" title="4 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6238634830419117637?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6238634830419117637?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/F2sQHW7OWSQ/wikipedias-nerslackning-och-risken-med.html" title="Wikipedias nersläckning och risken med klientkod" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/wikipedias-nerslackning-och-risken-med.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8FR3k6eip7ImA9WhRVEkQ.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-3074720513403782180</id><published>2012-01-11T17:20:00.001+01:00</published><updated>2012-01-11T17:20:16.712+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-11T17:20:16.712+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="trådar" /><category scheme="http://www.blogger.com/atom/ns#" term="swing" /><category scheme="http://www.blogger.com/atom/ns#" term="gui" /><category scheme="http://www.blogger.com/atom/ns#" term="awt" /><title>Trådar utan trassel i Swing</title><content type="html">Något som trots sin enkelhet tog mig många år att förstå är trådmodellen i javas grafiska gränssnitt AWT (uttalas swing). Det var inte förrän jag läste en bok trådning, &lt;a href="http://www.amazon.co.uk/gp/product/0321349601/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=javatankar-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=0321349601" target="_blank"&gt;Java Concurrency in Practice&lt;/a&gt;, som poletten trillade ner. Det hela är (på något plan) väldigt enkelt - swing är singeltrådat och körs i en enda tråd som vi kallar swing-tråden. Detta innebär i sin tur att vi kan fastställa ett par enkla levnadsregler för att du ska slippa trådningsbuggar i ditt användargränssnitt:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Inga klasser i swing är trådsäkra&lt;/b&gt;&amp;nbsp;om det inte uttryckligen står annat i dess javadoc (men det gör det troligtvis inte).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Kod i metoder som triggas av händelser i gränssnittet körs i swing-tråden&lt;/b&gt;&amp;nbsp;och kan därmed interagera med swing utan risk för trådningsproblematik.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;All annan kod som interagerar med swing skall exekveras i swing-tråden&lt;/b&gt;, vilket med fördel&amp;nbsp;görs av en &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Runnable&lt;/span&gt; med hjälp av &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SwingUtilities.invokeAndWait()&lt;/span&gt; eller &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;SwingUtilities.invokeLater()&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Vill du dessutom undvika att göra gränssnittet slött eller apatiskt till och från så bör du köra alla icke-triviala uppgifter i någon annan tråd än swing-tråden, eftersom swing kommer att vänta på att den senare blir ledig igen innan det kan rita om eller reagera på stimuli från användaren.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Lycka till, och kom ihåg var du hörde det först!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-3074720513403782180?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QAe4qHgFGPjDsvNWUg-xmcIz5Ls/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QAe4qHgFGPjDsvNWUg-xmcIz5Ls/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QAe4qHgFGPjDsvNWUg-xmcIz5Ls/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QAe4qHgFGPjDsvNWUg-xmcIz5Ls/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/cyIPppQAVIc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/3074720513403782180/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/tradar-utan-trassel-i-swing.html#comment-form" title="4 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/3074720513403782180?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/3074720513403782180?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/cyIPppQAVIc/tradar-utan-trassel-i-swing.html" title="Trådar utan trassel i Swing" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/tradar-utan-trassel-i-swing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EBSHk9fSp7ImA9WhRVEUQ.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-4411108637521991378</id><published>2012-01-10T09:14:00.001+01:00</published><updated>2012-01-10T13:47:39.765+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T13:47:39.765+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mocks" /><category scheme="http://www.blogger.com/atom/ns#" term="unittest" /><category scheme="http://www.blogger.com/atom/ns#" term="mock" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="attrapper" /><category scheme="http://www.blogger.com/atom/ns#" term="enhetstest" /><category scheme="http://www.blogger.com/atom/ns#" term="google mockito" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><title>Enhetstestning med attrapper</title><content type="html">En attrapp (mock) är enligt ordboken ett objekt som är konstruerat för att se ut som ett annat objekt, utan att för den skull ha några utav dess egenskaper. Exempel från IRL kan vara en mobilattrapp i telebutiken, en vette vid andjakt eller en uppblåsbar pansarvagn i krig. Det de alla har gemensamt är att de är enklare och billigare att producera än den äkta varan, och det är precis dessa egenskaper vi är ute efter när vi använder attrapper i enhetstester: Istället för att själva subklassa de perifera klasserna till önskat beteende så låter vi ett attrappramverk generera dem "i förbifarten". Mitt självklara val av ramverk är sedan några år tillbaka &lt;a href="http://code.google.com/p/mockito/" target="_blank"&gt;Mockito&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Attrapper används för att interagera med den testade klassen. Dels kan de prepareras för att svara på ett förutbestämt sätt när de anropas, dels används de för att verifiera de blir anropade på ett enligt testfallet väntat sätt.&lt;br /&gt;
&lt;br /&gt;
I koden nedan visar jag ett mycket enkelt exempel på hur en attrapp kan användas för att testa den adapter jag skrev om igår. I koden skapas attrappen med ett anrop till &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Mockito.mock&lt;/span&gt; och efter att den testade klassen anropats verifieras att attrappen stimulerades på väntat sätt med hjälp av &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Mockito.verify&lt;/span&gt;.&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;
&lt;b&gt;import&lt;/b&gt; org.mockito.Mockito;
&lt;b&gt;import&lt;/b&gt; org.testng.annotations.Test;
&lt;b&gt;import&lt;/b&gt; javax.swing.JTextArea;

@Test
&lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; OutputStreamAdapterTest
{
    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;void&lt;/b&gt; testFlush()
    {
        JTextArea textArea = Mockito.mock(JTextArea.class);
        &lt;b&gt;new&lt;/b&gt; OutputStreamAdapter(textArea).flush();
        Mockito.verify(textArea).repaint();
    }

    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;void&lt;/b&gt; testWriteChar()
    {
        JTextArea textArea = Mockito.mock(JTextArea.class);
        &lt;b&gt;new&lt;/b&gt; OutputStreamAdapter(textArea).write('a');
        Mockito.verify(textArea).append("a");
    }

    &lt;b&gt;public&lt;/b&gt; &lt;b&gt;void&lt;/b&gt; testWriteString()
    {
        String str = "Hello, World!";
        JTextArea textArea = Mockito.mock(JTextArea.class);
        &lt;b&gt;new&lt;/b&gt; OutputStreamAdapter(textArea).write(str.getBytes());
        Mockito.verify(textArea).append(str);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-4411108637521991378?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oRCMKLlpxHjbc6ejDZ9uBiZvgCI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oRCMKLlpxHjbc6ejDZ9uBiZvgCI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oRCMKLlpxHjbc6ejDZ9uBiZvgCI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oRCMKLlpxHjbc6ejDZ9uBiZvgCI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/FfWuf8FzGi8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/4411108637521991378/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/enhetstestning-med-attrapper.html#comment-form" title="4 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/4411108637521991378?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/4411108637521991378?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/FfWuf8FzGi8/enhetstestning-med-attrapper.html" title="Enhetstestning med attrapper" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/enhetstestning-med-attrapper.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcNQ38_cCp7ImA9WhRVEU0.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-6954993584198240762</id><published>2012-01-09T10:58:00.000+01:00</published><updated>2012-01-09T10:58:12.148+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-09T10:58:12.148+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wrapper" /><category scheme="http://www.blogger.com/atom/ns#" term="adapter" /><category scheme="http://www.blogger.com/atom/ns#" term="design pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="designmönster" /><title>Designmönster: Adapter</title><content type="html">Ett designmönster som är både kraftfullt och enkelt är adaptermönstret. Det går precis som det låter ut på att anpassa ett objekt så att det passar ihop med ett annat objekt. Tänk på en sådan där reseadapter du har när du är ute och åker som gör att din mobilladdare passar i eluttaget i Storbritannien, så har du en bra bild av vad adaptermönstret går ut på. Ibland tänker man sig att adaptern kapslar in den anpassade klassen och kaller den då istället för "wrapper". Personligen tycker jag "adapter" är ett bättre och tydligare namn.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;img src="http://3.bp.blogspot.com/-1RbR-o2Kr9Y/TwqwdRxFbhI/AAAAAAAAAM8/XrAUJiXyqNU/s1600/Adapter.png" /&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
För ett par dagar sedan behövde jag skriva information till en textruta i ett grafiskt användargränssnitt. Komponenterna som skrev informationen skrev till den vanliga utströmmen&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;System.out&lt;/span&gt;. Jag skrev då en adapter som anpassade textrutan till &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;OutputStream&lt;/span&gt;s gränssnitt, varpå jag kunde koppla ihop den med en &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;PrintStream&lt;/span&gt; dit den vanliga utströmmen kunde styras om med hjälp av anropet&lt;pre&gt;&lt;code&gt;System.setOut(new PrintStream(new OutputStreamAdapter(messageArea),
                              true /* autoflush enabled */));&lt;/code&gt;&lt;/pre&gt; Koden för adaptern såg ut som följer:&lt;pre&gt;&lt;code&gt;
&lt;b&gt;import&lt;/b&gt; javax.swing.JTextArea;
&lt;b&gt;import&lt;/b&gt; java.io.OutputStream;

/**
 * Adapts the text area to emulate an output stream reader.
 */
&lt;b&gt;class&lt;/b&gt; OutputStreamAdapter &lt;b&gt;extends&lt;/b&gt; OutputStream
{
    &lt;b&gt;private final &lt;/b&gt;JTextArea textArea;

    &lt;b&gt;public&lt;/b&gt; OutputStreamAdapter(JTextArea out) 
    {
        this.textArea = out;
    }

    @Override &lt;b&gt;public void&lt;/b&gt; write(int i) 
    {
        textArea.append(String.valueOf((char) i));
    }

    @Override &lt;b&gt;public void&lt;/b&gt; write(byte[] bytes) 
    {
        textArea.append(new String(bytes));
    }

    @Override &lt;b&gt;public void&lt;/b&gt; flush() 
    {
        // Instead of flushing, force repaint
        textArea.repaint();
    }

    @Override &lt;b&gt;public void&lt;/b&gt; close() { }
}
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-6954993584198240762?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wyk0XgnrvqQuM0B_obMxiBagn_M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wyk0XgnrvqQuM0B_obMxiBagn_M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wyk0XgnrvqQuM0B_obMxiBagn_M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wyk0XgnrvqQuM0B_obMxiBagn_M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/r_XwBeQdBqg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/6954993584198240762/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/designmonster-adapter.html#comment-form" title="0 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6954993584198240762?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6954993584198240762?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/r_XwBeQdBqg/designmonster-adapter.html" title="Designmönster: Adapter" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-1RbR-o2Kr9Y/TwqwdRxFbhI/AAAAAAAAAM8/XrAUJiXyqNU/s72-c/Adapter.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/designmonster-adapter.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08NRH0ycCp7ImA9WhRVEEQ.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-7838367258858642935</id><published>2012-01-04T20:26:00.000+01:00</published><updated>2012-01-09T10:04:55.398+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-09T10:04:55.398+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google guava" /><category scheme="http://www.blogger.com/atom/ns#" term="google collections" /><title>Ordning i Google Guava</title><content type="html">Ett klassbibliotek som ligger mig varmt om hjärtat är &lt;a href="http://code.google.com/p/guava-libraries/" target="_blank"&gt;Google Guava&lt;/a&gt;. Det innehåller en hel del smått och gott och är utmärkt komplement till Javas API när du bygger en icke-trivial applikation. Jag kommer med jämna mellanrum publicera små godbitar för att sprida kunskapen om (och förhoppningsvis användningen av) detta bibliotek. Först ut blir klassen för ordning, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;com.google.common.collect.Ordering&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
Klassen &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Ordering&lt;/span&gt;&amp;nbsp;är en utökning av &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Comparable&lt;/span&gt; och representerar ordning och de operationer som hör ihop med detta begrepp. En mängd färdiga ordningar finns, exempelvis den naturliga, en explicit (partiell) ordning, och en godtycklig ordning som är konsistent under programmets körning. Stöd finns bland annat för att kombinera ordningar (och funktioner), vända ordningsföljd, tillåta nullvärden (och då definiera om de kommer före eller efter övriga värden). En användbar metod är &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;sortedCopy(iterable)&lt;/span&gt; som returnerar en sorterad kopia av argumentet och &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;max&lt;/span&gt;- och &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;min&lt;/span&gt;-metoderna som returnerar det högsta respektive lägsta värdet eller värdena.&lt;br /&gt;
&lt;br /&gt;
I exemplet nedan använder jag ordningar och funktioner för att avgöra vem som vunnit en auktion. Koden kan utläsas som att det högsta värdet hämtas genom att naturliga ordningen appliceras på resultatet av sammansättningen av två funktioner. Den ena funktionen skapad av &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Functions.forMap&lt;/span&gt; slår upp ett bud i mappningen givet en budgivare, &amp;nbsp;den andra returnerar beloppet på detta bud.&lt;br /&gt;
&lt;pre&gt;Map&amp;lt;Bidder, Bid&amp;gt; auctionBids = ...;
Bidder highestBidder
  = Ordering.natural()
            .onResultOf(compose(BID_AMOUNT_FUNCTION,
                                forMap(auctionBids)))
            .max(auctionBids.keySet());
&lt;/pre&gt;Paradigmen påminner mycket om den som används i funktionella språk och kan kräva en del övning innan den sitter i ryggmärgen. Fördelen är kod med låg komplexitet och hög uttrycksfullhet. Fundera gärna en stund vad som krävts för att göra motsvarande jobb utan Guavas hjälp i form av lokala variabler, loopar och if-satser...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-7838367258858642935?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GUmZbpuTHm5Gik_gMj6-wZ-kjKY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GUmZbpuTHm5Gik_gMj6-wZ-kjKY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GUmZbpuTHm5Gik_gMj6-wZ-kjKY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GUmZbpuTHm5Gik_gMj6-wZ-kjKY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/W0KtnYOVvaY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/7838367258858642935/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/ordning-i-google-guava.html#comment-form" title="0 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/7838367258858642935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/7838367258858642935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/W0KtnYOVvaY/ordning-i-google-guava.html" title="Ordning i Google Guava" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/ordning-i-google-guava.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQCQXc4cCp7ImA9WhRWFkQ.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-8069396544654333652</id><published>2012-01-04T09:57:00.010+01:00</published><updated>2012-01-04T17:59:20.938+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T17:59:20.938+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tid" /><category scheme="http://www.blogger.com/atom/ns#" term="joda-time" /><category scheme="http://www.blogger.com/atom/ns#" term="datum" /><category scheme="http://www.blogger.com/atom/ns#" term="datetime" /><category scheme="http://www.blogger.com/atom/ns#" term="calendar" /><category scheme="http://www.blogger.com/atom/ns#" term="date" /><title>Kampanj för verklig tid</title><content type="html">&lt;div&gt;&lt;div&gt;En svaghet i java är tid- och datumhantering. Både Date och Calendar är föränderliga och således inte trådsäkra. Det är dessutom inte särskilt intuitivt och tämligen krångligt att arbeta med de objekten om du jobbar med datum. Lösningen heter joda-time och finns på &lt;a href="http://joda-time.sourceforge.net/"&gt;http://joda-time.sourceforge.net/&lt;/a&gt; &lt;/div&gt;&lt;div&gt;Här finns allt du behöver för att hantera datum och tid på ett enkelt sätt, utan att för den skull begränsa dina möjligeter. Med normalt användande så är det DateTime-objektet man använder. Det är oföränderligt (och således trådsäkert) och serialiseringsbart. &lt;/div&gt;&lt;div&gt;Det enkla är enkelt: &lt;pre&gt;DateTime now = new DateTime();
DateTime inAnHour = now.plusHour(1);
DateTime someonesBirthday = DateTime.parse("2009-09-30T21:12");
DateTime thisDate2011 = now.withYear(2011);
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Naturligtvis går det att lägga på andra tidszoner (eller köra utan) och även andra kalendersystem och lite annat godis som intervallhantering. Självklart kan du också skapa ett DateTime-objekt från ett Calendar- eller Date-objekt rakt av. &lt;pre&gt;DateTime nowInKuwait
  = now.withChronology(IslamicChronology.getInstance());
DateTime now = new DateTime(new Date(System.currentTimeMillis()));
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Det går också att få lokaliserade namn om du vill det: &lt;pre&gt;String nameOfTodayDay
  = now.dayOfWeek().getAsText(Locale.getDefault());
&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Tyvärr är det fortfarande otroliga mängder legacy-kod som kräver Date eller Calendar, så det går inte att glömma dem helt. Men det är en bra ide att försöka! &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-8069396544654333652?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZJyoXYK5GWttyq_n3qvEntYkI3Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZJyoXYK5GWttyq_n3qvEntYkI3Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZJyoXYK5GWttyq_n3qvEntYkI3Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZJyoXYK5GWttyq_n3qvEntYkI3Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/LVwDqMPbKJA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/8069396544654333652/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/kampanj-for-verklig-tid.html#comment-form" title="4 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/8069396544654333652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/8069396544654333652?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/LVwDqMPbKJA/kampanj-for-verklig-tid.html" title="Kampanj för verklig tid" /><author><name>Tomaz Hägglund</name><uri>https://profiles.google.com/107405706001348451477</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/kampanj-for-verklig-tid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMMRHc9fCp7ImA9WhRWFko.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-8390008716201628805</id><published>2012-01-04T09:56:00.000+01:00</published><updated>2012-01-04T11:54:45.964+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-04T11:54:45.964+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rekrytering" /><category scheme="http://www.blogger.com/atom/ns#" term="arbetsprov" /><title>Arbetsprov bästa verktyget vid rekrytering</title><content type="html">Jag har under mina snart åtta år hos min nuvarande arbetsgivare assisterat vid rekrytering av utvecklare. Ett av de viktigaste hjälpmedlen för mig har varit de arbetsprov kandidaterna får göra för att visa sina kunskaper i javaprogrammering. Provet är relativt enkelt och tar ungefär en arbetsdag att göra om man är van med teknikerna som behövs och ett par extra dagar annars. Något som har slagit mig är den otroliga variationen i kvalitet på de inlämnade svaren. En tung meritförteckning är inte på något sätt synonymt med goda resultat.&lt;br /&gt;
&lt;br /&gt;
Jag har nyligen registrerat mig på &lt;a href="http://www.freelancer.com"&gt;Freelancer&lt;/a&gt; och noterar genast den stora mängden uppdrag som erbjuds av studenter, uppdrag där de vill ha hjälp att lösa lätta, på gränsen till triviala, programmeringsproblem. Det här tyder på ett ointresse att lära sig, vilket kommer att medföra i bästa fall en medioker prestation i yrkeslivet. Du vill inte vara den arbetsgivare som anställer en av dessa...&lt;br /&gt;
&lt;br /&gt;
Att det skulle förhålla sig på detta sätt var för mig inte helt oväntat. Efter att ha rättat ett tjugotal arbetsprov kan jag avslöja att jag bedömt cirka 20% av dem som rena plagiat. Kandidaten har googlat, hittat liknande kod, kopierat den och tagit bort all dokumentation om ursprung, för att sedan göra några modifieringar och lämna in koden så som sin egen. &lt;br /&gt;
&lt;br /&gt;
Samtidigt finns det en liten del av kandidaterna som är värda sin vikt i guld. Arbetsprovet brukar visa detta tydligt, och efter en diskussion om lösning med kandidaten kan man försäkra sig om att lösningen är hennes egen.&lt;br /&gt;
&lt;br /&gt;
Detta visar vikten av att använda ett arbetsprov vid rekrytering. För dig som vill veta vem du anställer är arbetsprovet bästa verktyget!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-8390008716201628805?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fBMxEY_KzJQsII5unVwDhiohQQM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fBMxEY_KzJQsII5unVwDhiohQQM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fBMxEY_KzJQsII5unVwDhiohQQM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fBMxEY_KzJQsII5unVwDhiohQQM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/IHI4Kd27udk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/8390008716201628805/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/arbetsprov-basta-verktyget-vid.html#comment-form" title="3 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/8390008716201628805?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/8390008716201628805?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/IHI4Kd27udk/arbetsprov-basta-verktyget-vid.html" title="Arbetsprov bästa verktyget vid rekrytering" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/arbetsprov-basta-verktyget-vid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEBRH05fSp7ImA9WhRWFUw.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-6277741859884261671</id><published>2012-01-02T15:49:00.001+01:00</published><updated>2012-01-02T16:04:15.325+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-02T16:04:15.325+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enhetstester" /><category scheme="http://www.blogger.com/atom/ns#" term="unittest" /><category scheme="http://www.blogger.com/atom/ns#" term="mock" /><category scheme="http://www.blogger.com/atom/ns#" term="attrapper" /><category scheme="http://www.blogger.com/atom/ns#" term="Mockito" /><category scheme="http://www.blogger.com/atom/ns#" term="testramverk" /><title>Trevliga nyheter i Mockito 1.9</title><content type="html">Det har tillkommit en hel del behändig funktionalitet i senaste Mockito-släppet. En av dem är möjligheten att göra enradsattrapper:&lt;br /&gt;
&lt;pre&gt;Car boringStubbedCar 
    = when(mock(Car.class).shiftGear())
       .thenThrow(EngineNotStarted.class).getMock();
&lt;/pre&gt;En annan är möjligheten att mycket enkelt göra djupa attrapper, vilket är särskilt användbart vid testning av existerande kod:&lt;br /&gt;
&lt;pre&gt;Foo mock = mock(Foo.class, RETURNS_DEEP_STUBS);
when(mock.getBar().getName()).thenReturn("deep");
assertEquals("deep", mock.getBar().getName());
&lt;/pre&gt;Mockito är ett mycket användbart och väldesignat testramverk för att skapa attrapper. Mer information om Mockito hittar du på &lt;a href="http://code.google.com/p/mockito/" target="_blank"&gt;http://code.google.com/p/mockito/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-6277741859884261671?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/H8HMYzcLcR9656_9W2ZLc7kp714/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H8HMYzcLcR9656_9W2ZLc7kp714/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/H8HMYzcLcR9656_9W2ZLc7kp714/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H8HMYzcLcR9656_9W2ZLc7kp714/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/q9hFYoGzobc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/6277741859884261671/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/trevliga-nyheter-i-mockito-19.html#comment-form" title="2 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6277741859884261671?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6277741859884261671?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/q9hFYoGzobc/trevliga-nyheter-i-mockito-19.html" title="Trevliga nyheter i Mockito 1.9" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/trevliga-nyheter-i-mockito-19.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QHQns_eip7ImA9WhRWFEk.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-7490326625415082683</id><published>2012-01-01T15:54:00.000+01:00</published><updated>2012-01-01T19:08:53.542+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-01T19:08:53.542+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="enum" /><category scheme="http://www.blogger.com/atom/ns#" term="effective java" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="fabriksmetod" /><category scheme="http://www.blogger.com/atom/ns#" term="fabrik" /><category scheme="http://www.blogger.com/atom/ns#" term="enums" /><category scheme="http://www.blogger.com/atom/ns#" term="switch" /><category scheme="http://www.blogger.com/atom/ns#" term="joshua bloch" /><title>Kraftfulla enums</title><content type="html">Nyckelordet &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;enum&lt;/span&gt; är i Java kraftfullare än vad man i första anblicken kan tro. Varje konstant är nämligen ett fullfjädrat objekt. Detta innebär att du kan skapa subklasser i uppräkningen av dina konstanter. Istället för att skriva &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;switch&lt;/span&gt;-satser över uppräkningens konstanter så bör du ofta lägga till en metod i definitionen av uppräkningen istället. Koden nedan ersätter en separat fabrik och ev tillhörande gränssnitt. Dessutom riskerar du inte att missa något fall när du lägger till ytterligare en konstant. Vill du läsa mer om uppräkningar i Java rekommenderar jag kapitlet &lt;i&gt;Enums and Annotations&lt;/i&gt; i &lt;a href="http://www.amazon.co.uk/gp/product/0321356683/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=javatankar-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=0321356683" target="_blank"&gt;Effective Java, Second Edition&lt;/a&gt; av Joshua Bloch.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;span class="Apple-style-span" style="font-family: Times; white-space: normal;"&gt;&lt;pre&gt;&lt;span class="s0" style="color: navy; font-weight: bold;"&gt;public enum &lt;/span&gt;&lt;span class="s1"&gt;GameStateType 
{ 
    WAITING_FOR_PLAYERS { 
        &lt;/span&gt;&lt;span class="s0" style="color: navy; font-weight: bold;"&gt;public &lt;/span&gt;&lt;span class="s1"&gt;GameState createState(GameComponent component) { 
&lt;/span&gt;            &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;return new &lt;/span&gt;&lt;span class="s1"&gt;WaitingForPlayers(component); 
&lt;/span&gt;        } 
    }, 
    SELECTING_DEALER { 
        &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;public &lt;/span&gt;&lt;span class="s1"&gt;GameState createState(GameComponent component) { 
&lt;/span&gt;            &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;return new &lt;/span&gt;&lt;span class="s1"&gt;SelectingDealer(component); 
&lt;/span&gt;        } 
    }, 
    PLAYING_TRICK { 
        &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;public &lt;/span&gt;&lt;span class="s1"&gt;GameState createState(GameComponent component) { 
&lt;/span&gt;            &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;return new &lt;/span&gt;&lt;span class="s1"&gt;PlayingTrick(component); 
&lt;/span&gt;        } 
    }, 
    DETERMINING_WINNER { 
        &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;public &lt;/span&gt;&lt;span class="s1"&gt;GameState createState(GameComponent component) { 
&lt;/span&gt;            &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;return new &lt;/span&gt;&lt;span class="s1"&gt;DeterminingWinner(component); 
&lt;/span&gt;        } 
    }, 
    GAME_FINISHED { 
        &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;public &lt;/span&gt;&lt;span class="s1"&gt;GameState createState(GameComponent component) { 
&lt;/span&gt;            &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;return new &lt;/span&gt;&lt;span class="s1"&gt;GameFinished(component); 
&lt;/span&gt;        } 
    }; 
 
    &lt;span class="s0" style="color: navy; font-weight: bold;"&gt;public abstract &lt;/span&gt;&lt;span class="s1"&gt;GameState createState(GameComponent component); 
&lt;/span&gt;} &lt;/pre&gt;
&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-7490326625415082683?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JrNUczESVXMLWGHnoEJ6tUaMiDg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JrNUczESVXMLWGHnoEJ6tUaMiDg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JrNUczESVXMLWGHnoEJ6tUaMiDg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JrNUczESVXMLWGHnoEJ6tUaMiDg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/2QgXLI4V3pc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/7490326625415082683/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/kraftfulla-enums.html#comment-form" title="0 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/7490326625415082683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/7490326625415082683?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/2QgXLI4V3pc/kraftfulla-enums.html" title="Kraftfulla enums" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/kraftfulla-enums.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IARng6cSp7ImA9WhRWFEw.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-7066944236884376228</id><published>2012-01-01T11:59:00.000+01:00</published><updated>2012-01-01T11:59:07.619+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-01T11:59:07.619+01:00</app:edited><title>Ny medbloggare</title><content type="html">Jag har glädjen att meddela att min vän och före detta kollega Tomaz anluter sig som författare till denna blog! Tillsammans har vi över tjugofem års erfarenhet av utveckling i java och har under en lång tid agerat sparringpartners i diskussioner om kod, design och problemlösning, både yrkesmässigt och privat. Nu kommer vi förhoppningsvis ta en del av dess diskussioner ut i etern. Välkommen ombord Tomaz!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-7066944236884376228?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DFXdpimlnYuHsqmm1LcUiuPSgyw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DFXdpimlnYuHsqmm1LcUiuPSgyw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DFXdpimlnYuHsqmm1LcUiuPSgyw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DFXdpimlnYuHsqmm1LcUiuPSgyw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/iHjF9068I5w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/7066944236884376228/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2012/01/ny-medbloggare.html#comment-form" title="0 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/7066944236884376228?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/7066944236884376228?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/iHjF9068I5w/ny-medbloggare.html" title="Ny medbloggare" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.javatankar.com/2012/01/ny-medbloggare.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEFSHg_fip7ImA9WhRWEkU.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-2015218634473089820</id><published>2011-12-30T01:23:00.001+01:00</published><updated>2011-12-30T22:30:19.646+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-30T22:30:19.646+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="boktips" /><title>Hastigt om kastning</title><content type="html">&lt;a href="http://www.amazon.co.uk/gp/product/0321246780/ref=as_li_ss_il?ie=UTF8&amp;amp;tag=javatankar-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=0321246780" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://ws.assoc-amazon.co.uk/widgets/q?_encoding=UTF8&amp;amp;Format=_SL160_&amp;amp;ASIN=0321246780&amp;amp;MarketPlace=GB&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;tag=javatankar-21&amp;amp;ServiceVersion=20070822" /&gt;&lt;/a&gt;Jag lyckades med en juholtare för ett par dagar sedan. Jag stötte på en kodsnutt med följande särdrag:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int a = ...;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int b = ...;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;double f = 1 - (double) a / b;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Lika snabbt som felaktigt drog jag slutsatsen att "det där kan ju inte fungera som tänkt eftersom division binder hårdare än kastningen till flyttal". Jag skickade några minuter senare ett mail till teamet om mitt fynd och undrade hur vi skulle gå vidare med detta. Senare samma dag slog det mig att jag kanske förhastat mig. Jag lade några minuter på att slå i Javas språkspecifikation och fann snart att kastningen kommer att utföras före divisionen.&amp;nbsp;&lt;/span&gt;Pinsamt. Ytterst pinsamt.&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: justify;"&gt;
Lärdom av detta är ju att jag borde ha friskat upp minnet genom att slå upp hur uttryck beräknas i språkspecifikationen eller &amp;nbsp;skrivit ett test innan jag drog förhastade slutsatser. En annan, och kanske än viktigare erfarenhet, är att liknande uttryck bör skrivas med parenteser för att tydligt visa avsikten eller på ett sådant sätt att inget missförstånd &lt;i&gt;kan&lt;/i&gt; uppstå:&lt;/div&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;double f = 1 - a /&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;(double)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;b;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Har du inte ett eget referensexemplar av senaste språkspecifikationen kan du &lt;a href="http://www.amazon.co.uk/gp/product/0321246780/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=javatankar-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=0321246780" target="_blank"&gt;köpa den från amazon.co.uk&lt;/a&gt; eller läsa den &lt;a href="http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html" target="_blank"&gt;online&lt;/a&gt;. I den finns alla sliskiga detaljer om hur språket är konstruerat och därmed ett måste för den sanna javanörden...&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-2015218634473089820?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/M4--wjxq9kocJyF3_xgTcMUGV-0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M4--wjxq9kocJyF3_xgTcMUGV-0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/M4--wjxq9kocJyF3_xgTcMUGV-0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M4--wjxq9kocJyF3_xgTcMUGV-0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/r-g9nMFxH3I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/2015218634473089820/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2011/12/jag-lyckades-med-en-juholtare-for-ett.html#comment-form" title="1 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/2015218634473089820?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/2015218634473089820?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/r-g9nMFxH3I/jag-lyckades-med-en-juholtare-for-ett.html" title="Hastigt om kastning" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.javatankar.com/2011/12/jag-lyckades-med-en-juholtare-for-ett.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QDQ3ozeSp7ImA9WhRWEU0.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-3315982194217077104</id><published>2011-12-28T22:56:00.000+01:00</published><updated>2011-12-28T22:56:12.481+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-28T22:56:12.481+01:00</app:edited><title>Språkval</title><content type="html">&lt;div&gt;
Bland oss utvecklare är det mycket vanligt att vi under samtal och i epost blandar svenska och engelska ord om vartannat. Många av de termer vi behöver är vi dessutom vana att se uteslutande i dess engelska skepnad. Jag upplever att språket ibland blir lidande av denna blandning. Att skriva på svenska är för mig effektivt, vilket är en förutsättning för bloggens fortlevnad. Jag kan vidare lättare uttrycka nyanser i svenskan och ha ett mer varierat och tilltalande språkbruk. Därför har jag valt att blogga i huvudsak på svenska. Detta är min ambition - naturligtvis kommer det slinka in en och annan engelsk term av slentrian eller för att jag inte finner ett svenskt alternativ. För att underlätta för er läsare har jag nu lagt upp en&amp;nbsp;&lt;a href="http://javatankar.blogspot.com/p/ordlista.html"&gt;ordlista&lt;/a&gt;&amp;nbsp;för de svenska termerna.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-3315982194217077104?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7ALOe9CEY6ljDYF8ny7YTIM0D98/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7ALOe9CEY6ljDYF8ny7YTIM0D98/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7ALOe9CEY6ljDYF8ny7YTIM0D98/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7ALOe9CEY6ljDYF8ny7YTIM0D98/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/vDbDHyp2648" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/3315982194217077104/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2011/12/sprakval.html#comment-form" title="2 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/3315982194217077104?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/3315982194217077104?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/vDbDHyp2648/sprakval.html" title="Språkval" /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.javatankar.com/2011/12/sprakval.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYDR3k9fSp7ImA9WhRWEEo.&quot;"><id>tag:blogger.com,1999:blog-4611309994385452200.post-6883704461715643700</id><published>2011-12-28T14:16:00.000+01:00</published><updated>2011-12-28T14:16:16.765+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-28T14:16:16.765+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="reflection" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Mockito" /><title>Reflektioner om reflection...</title><content type="html">Till att börja med vill jag berätta att jag sedan länge är en stor vän av reflection. Idag har dock mitt tålamod provats ordentligt just på grund av detta. Därav läge att samla mina tankar kring reflection och vad som krävs en tillämpning för vinna min uppskattning. Grundprincipen visar sig vara ganska enkel och dogmatisk:&amp;nbsp;Inga strängar skola användas för att referera till identifierare i kod.&lt;br /&gt;
&lt;br /&gt;
Detta eftersom en sträng som referens orsakar följande otyg:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Metoder kommer att markeras som oanvända och därmed sannolikt uppfattas som död kod och riskera att raderas av misstag.&lt;/li&gt;
&lt;li&gt;Sökning på metodanvändning kommer inte heller att fungera, så det blir mycket svårare att exempelvis hitta var medlemmar anropas (till exempel för att sätta objektegenskaper).&lt;/li&gt;
&lt;li&gt;Felstavningar fångas inte vid kompilering, och om det dessutom saknas rimlig felhantering så kan ett litet svårupptäckt stavfel göra att koden inte beter sig som förväntat.&lt;/li&gt;
&lt;li&gt;Omarbetning av kod blir farlig då utvecklingsmiljön inte nödvändigtvis fångar strängreferenserna vid namnbyten etc.&lt;/li&gt;
&lt;/ol&gt;
Som ni förstår har jag precis sågat spring-injection vid fotknölarna. Och det står jag för. Motbevisa mig gärna.&lt;br /&gt;
&lt;br /&gt;
Några exempel på reflection där jag tycker det är fantastiskt är testramverket Mockito som på ett mycket elegant sätt låter dig skapa attrapper att jobba med. I tillämpningar som JAXB (för att mappa javaobjekt till XML) fungerar det också bra. Vid några tillfällen har jag också funnit hjälpmetoder som dynamiskt jämför två objekt med avseende på likhet eller skapar en strängrepresentation vara värdefulla.&lt;br /&gt;
&lt;br /&gt;
Att använda dynamiska ombud som hjälpmedel för att representera metodanrop är dessutom helt underbart och spar otroliga mängder kod samtidigt som läsbarheten ökar markant. Sen har jag en mängd egna tillämpningar som jag med all sannolikhet kommer visa upp här i bloggen vid senare tillfälle...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4611309994385452200-6883704461715643700?l=www.javatankar.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/qmdaw3U6J-iuKkphX4683nXQd9A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qmdaw3U6J-iuKkphX4683nXQd9A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/qmdaw3U6J-iuKkphX4683nXQd9A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/qmdaw3U6J-iuKkphX4683nXQd9A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Javatankar/~4/HQF_TSnagEE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.javatankar.com/feeds/6883704461715643700/comments/default" title="Kommentarer till inlägget" /><link rel="replies" type="text/html" href="http://www.javatankar.com/2011/12/reflektioner-om-reflection.html#comment-form" title="4 kommentarer" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6883704461715643700?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4611309994385452200/posts/default/6883704461715643700?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Javatankar/~3/HQF_TSnagEE/reflektioner-om-reflection.html" title="Reflektioner om reflection..." /><author><name>Per Huss</name><uri>https://profiles.google.com/102356538040937587052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh4.googleusercontent.com/-3iVoNSZ8tkk/AAAAAAAAAAI/AAAAAAAAAMs/qepdDH93br0/s512-c/photo.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://www.javatankar.com/2011/12/reflektioner-om-reflection.html</feedburner:origLink></entry></feed>

