<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>www.jugpadova.it: Ma voi le wrappate le liste?</title>
    <link>http://www.jugpadova.it/articles/2006/12/06/ma-voi-le-wrappate-le-liste</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Java User Group [Padova]</description>
    <item>
      <title>Ma voi le wrappate le liste?</title>
      <description>&lt;p&gt;Ciao, in un progetto su cui sto lavorando  sto provando un approccio che non avevo mai usato in passato per le liste di oggetti java, immaginate che di avere una lista tipo:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;
List&amp;lt;SomeObject&amp;gt; list = new ArrayList&amp;lt;SomeObject&amp;gt;();
&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Se volessi estrarre dalla lista tutti gli elementi aventi un certo campo valorizzato ad un dato valore, ovvero fare un filtro, farei:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;
class SomeObject {
  public static List&amp;lt;SomeObject&amp;gt; filterByField(List&amp;lt;SomeObject&amp;gt; input, String value) {
    // ciclo la lista input e restituisco una lista nuova con gli oggetti che hanno field=value 
  }
}
&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;usato così:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;
List&amp;lt;SomeObject&amp;gt; all = new ArrayList&amp;lt;SomeObject&amp;gt;();
List&amp;lt;SomeObject&amp;gt; filtered = SomeObject.filterByField(all, "someValue");
&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Il fatto però di avere metodi statici &amp;#8216;helper&amp;#8217; dentro &lt;code&gt;SomeObject&lt;/code&gt; per aggiungere funzionalità ad una lista non mi piace molto&amp;#8230; ho provato invece a wrappare &lt;code&gt;List&lt;/code&gt; e a spostare il metodo &lt;code&gt;filerByValue&lt;/code&gt; da &lt;code&gt;SomeObject&lt;/code&gt; alla nuova classe  &lt;code&gt;SomeObjects&lt;/code&gt;:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;
class SomeObjects extends ArrayList&amp;lt;SomeObject&amp;gt; {
   public SomeObjects filterByField(String value){
     // filtro ciclando gli elementi in this e restituisco una nuova istanza di SomeObjects
   }
}
&lt;/pre&gt;&lt;/code&gt;

Il codice di utilizzo quindi diventa: 
&lt;code&gt;&lt;pre&gt;
SomeObjects all = new SomeObjects();
SomeObjects filtered = all.filterByField("someValue");
&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Che mi pare molto più pulito e leggible, che ve ne pare?&lt;/p&gt;


	&lt;p&gt;So che non è un gran cambiamento, ma ho un parametro in meno per ogni &lt;code&gt;filterByXXX&lt;/code&gt; che desidero aggiungere e ogni metodo è nel posto che gli compete, ovvero i medoti per filtrare una lista stanno nella lista e non come metodi helper dell&amp;#8217;oggetto contenuto.&lt;/p&gt;


	&lt;p&gt;Un&amp;#8217;altro punto dove questo approccio è utile è nei Dao che wrappano funzionalità di IBatis o Hibernate, dove si trova spesso codice di questo tipo per prevenire il ritorno di liste nulle:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;
List&amp;lt;SomeObject&amp;gt; result = new ArrayList&amp;lt;SomeObject&amp;gt;();
result.addAll( ...queryForList("your query", param));
return result;
&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Con i wrapper possiamo scrivere un costruttore ad hoc, che prende una lista in input e fa &lt;code&gt;addAll(...)&lt;/code&gt; solo se è diversa da &lt;code&gt;null&lt;/code&gt;:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;
public class SomeObjects extends ArrayList&amp;lt;SomeObject&amp;gt; {

    public SomeObjects () {}

    public SomeObjects (Collection&amp;lt;SomeObject&amp;gt; c) {
       if (c!=null) addAll(c);
    }
}
&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;E il codice di utilizzo diventa magicamente:&lt;/p&gt;


&lt;code&gt;&lt;pre&gt;
return new SomeObjects(...queryForList("your query", param));
&lt;/pre&gt;&lt;/code&gt;

	&lt;p&gt;Fatemi sapere che ne pensate, io mi sto trovando bene con questo approccio.&lt;/p&gt;


	&lt;p&gt;&lt;small&gt;
&lt;em&gt;_ &lt;a href="mailto:paolo.dona@seesaw.it"&gt;Paolo Donà&lt;/a&gt; si occupa di sviluppo web in Java e Ruby, sviluppo progetti su commessa e formazione/training. Potete contattarlo via mail o leggere il suo blog &lt;a href="http://blog.seesaw.it"&gt;aziendale&lt;/a&gt; o &lt;a href="http://paolodona.blogspot.com"&gt;personale&lt;/a&gt;. _&lt;/em&gt;
&lt;/small&gt;&lt;/p&gt;
</description>
      <pubDate>Wed, 06 Dec 2006 08:45:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:020e07a4-edb2-4dfe-890c-2d06a79b9207</guid>
      <author>Paolo Dona'</author>
      <link>http://www.jugpadova.it/articles/2006/12/06/ma-voi-le-wrappate-le-liste</link>
      <category>Tips &amp; Tricks</category>
      <category>list</category>
      <trackback:ping>http://www.jugpadova.it/articles/trackback/10900</trackback:ping>
    </item>
    <item>
      <title>"Ma voi le wrappate le liste?" by enrico</title>
      <description>&lt;p&gt;Personalmente, ho sempre fatto così, avrei messo il/i metodo static per filtrare, in una classe esterna di utility tipo UtilityFilter. Quindi sono più in sintonia con quanto proposto da Lucio.&lt;/p&gt;</description>
      <pubDate>Thu, 07 Dec 2006 11:04:46 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:d19a3bf3-11ae-4f90-92bd-944177cc6911</guid>
      <link>http://www.jugpadova.it/articles/2006/12/06/ma-voi-le-wrappate-le-liste#comment-11173</link>
    </item>
    <item>
      <title>"Ma voi le wrappate le liste?" by Lucio Benfante</title>
      <description>&lt;p&gt;Ciao,
il meccanismo è interessante, e sicuramente il codice di utilizzo è molto più leggibile e semplice da scrivere.&lt;/p&gt;


	&lt;p&gt;Rimane però la necessità di implementare n classi diverse&amp;#8230;che in gran parte faranno la stessa cosa. Sei passato da n metodi di ricerca a n estesioni di List per aggiungere il metodo di ricerca. (ovvio non è detto che si possa estendere solo per i metodi di ricerca)&lt;/p&gt;


	&lt;p&gt;Fatalità oggi mi sta succedendo proprio questo: avrò implementato almeno 5 volte un metodo per fare una ricerca sequenziale su una List (di tipi diversi), praticamente sempre confrontando per uguaglianza un singolo campo.&lt;/p&gt;


	&lt;p&gt;Estendere una list non avrebbe migliorato di molto il mio lavoro. Un approccio &amp;#8220;più classico&amp;#8221;, operante non per ereditarietà secondo me sarebbe più flessibile.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;MyObject o = ListUtils.findSequential(
    myList, new Comparator() {...});&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;In generale secondo me è poco utile legarsi così strettamente al tipo contenuto all&amp;#8217;interno della collezione.&lt;/p&gt;</description>
      <pubDate>Wed, 06 Dec 2006 15:34:55 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:83fda828-ae94-41ff-9c04-3129d967bb61</guid>
      <link>http://www.jugpadova.it/articles/2006/12/06/ma-voi-le-wrappate-le-liste#comment-10971</link>
    </item>
  </channel>
</rss>
