2009-11-30 6 views
9
List<Question> questions = new ArrayList<Question>(); 
questions.addAll(getAllQuestions()); //returns a set of Questions 
Collections.sort(questions, new BeanComparator("questionId")); //org.apache.commons.beanutils.BeanComparator 

Sotto Java 1.5, quanto sopra funziona bene tranne che il 'nuovo BeanComparator ("questionId")' genera un avviso non controllato. Non mi piacciono gli avvertimenti. C'è un modo per fornire a BeanComparator un tipo o devo usare @SuppressWarnings("unchecked")?Java Collections.sort - aiutami a rimuovere l'avviso non controllato

+0

Hai provato lanciare la "nuova BeanComparator" per (comparatore )? –

+0

Questo solleverà un avviso diverso. – skaffman

+0

Solo qualcosa di completamente diverso, non ti piacerebbe piuttosto fare un 'ORDER BY id' in QuestionDAO? – BalusC

risposta

10

Le opzioni sono:

  • Change BeanComparator implementare Comparator<Question>. Questa non è una vera opzione qui, dato che è una nota classe di libreria esterna. Le persone non ti lasceranno fare.
  • Forcella e modificare BeanComparator come sopra, dandogli un FQN diverso.
  • Avvolgere il BeanComparator esistente con una classe che implementa Comparator<Question>.
  • Modificare il tipo di questions in List<?>.
  • Aggiungere un'annotazione di avvisi di soppressione.
+0

"Aggiungi un'annotazione di avvisi di soppressione". Questa dovrebbe essere l'ultima risorsa, dovrebbe accadere solo e solo quando sei sicuro al 100% che sia sicuro. –

+3

Ebbene si. Ma in situazioni come questa puoi essere sicuro al 100%. E se commetti un errore, il peggiore che otterrai è una ClassCastException in un luogo inaspettato. –

5

Dal BeanComparator non è generico, devi solo sopprimere.

AGGIORNAMENTO: In realtà, se ti dà abbastanza fastidio, potresti inserire il codice base per renderlo generico, poiché è Open Source.

0

Sì, si suppone di utilizzare @SuppressWarnings ("deselezionato"). Non c'è motivo di pensare che il comparatore che non usa i generici possa causare un problema in quel caso.

0

Si può sempre passare all'utilizzo di Google Collections.

Supportano Generics.

0

L'unico modo per rimuovere l'avviso è quello di modificare il codice di BeanComparator, ma anche se fosse possibile, a meno che non si sia reso un wrapper specifico che comprende il proprio tipo specifico, il concetto non funzionerebbe correttamente. La classe opera su qualsiasi oggetto per riflessione che può o meno avere il metodo. È intrinsecamente non typesafe.

Il modo più semplice intorno l'avvertimento è quello di implementare il proprio comparatore di prezzi:

public class QuestionComparator extends Comparator<Question> { 
     private BeanComparator peer = new BeanComparator("questionId"); 

     public int compare(Question o1, Question o2) { 
      return peer.compare(o1, o2); 
     } 
} 

Si potrebbe anche implementare uguale se è importante, e chiamare il BeanComparator metodo come questo equivale a:

public boolean equals(Object o) { 
     //boiler plate code here to ensure o is an instance of Question and not null 
     return ((QuestionComparator) o).peer.equals(peer); 
    } 
1

meno aggiungendo una nuova classe generica ad Apache Commons Beanutils, il meglio che ho trovato è stato quello di avvolgere BeanComparator in un nuovo metodo nella mia "cassetta degli attrezzi":

/** 
* Wrapping of Apache communs BeanComparator. Create a comparator which compares two beans by the specified bean 
* property. Property expression can use Apache's nested, indexed, combinated, mapped syntax. @see <a 
* href="http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/BeanComparator.html">Apache's Bean 
* Comparator</a> for more details. 
* @param <T> generic type 
* @param propertyExpression propertyExpression 
* @return the comparator 
*/ 
@SuppressWarnings("unchecked") 
public static <T> Comparator<T> createPropertyComparator(final String propertyExpression) { 
    return new BeanComparator(propertyExpression); 
} 
0

BeanComparator è una classe molto piccola. Afferra il codice sorgente e modificarlo in questo modo:

public class BeanComparator<E> implements Comparator<E>, Serializable {

e modificare l'invocazione in questo modo:

Collections.sort(yourCollection, new BeanComparator<yourBeanClass>(yourProperty));

e le avvertenze Voilà scomparsi.

1

creare una classe wrapper generico:

public class GenericBeanComparator<T> implements Comparator<T> { 
    private final BeanComparator myBeanComparator; 

    public GenericBeanComparator(String property) { 
    myBeanComparator = new BeanComparator(property); 
    } 

    public int compare(T o1, T o2) { 
    return myBeanComparator.compare(o1, o2); 
    } 
} 

usare in questo modo:

List<Question> questions = new ArrayList<Question>(); 
questions.addAll(getAllQuestions()); //returns a set of Questions 
Collections.sort(questions, new GenericBeanComparator<Question>("questionId")); 
Problemi correlati