2012-02-06 31 views
9

Ho appreso l'interfaccia Comparable, per la quale una classe deve implementare il metodo compareTo. Un progetto che sto usando quel metodo come:Che cosa fa esattamente org.apache.commons.lang.builder.CompareToBuilder?

public class EmployeeAssignmentTotal implements Comparable<EmployeeAssignmentTotal>, Serializable { 

private Employee employee; 
private int total; 
.... 
public int compareTo(EmployeeAssignmentTotal other) { 
    return new CompareToBuilder() 
      .append(employee, other.employee) 
      .append(total, other.total) 
      .toComparison(); 
} 

Cosa exacly fa CompareToBuilder fare qui? E come interagisce con gli attributi employee e total?


ho letto the javadocs, ma non posso fare testa o la coda di quello che stanno facendo con il costruttore e il multiplo append s. Questa domanda indica intenzioni poco chiare e ricerca zero?

+3

Il Javadoc (http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html) non è chiaro in qualche modo? – skaffman

+2

Non è chiaro in molti modi. In particolare come il calcolo del numero intero risultante o il modo in cui la sequenza di appende influenza il valore di ritorno. –

+2

Ho trovato questo post altamente informativo - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example – Shatu

risposta

4

Questa classe ha lo scopo di assistere l'utente nella creazione di metodi compareTo(). Immagina di avere più di 2 campi nella tua classe - codificare manualmente il tuo metodo di confronto potrebbe essere piuttosto ingombrante.

CompareToBuilder lo fa per te - ogni metodo append() aggiunge un nuovo confronto e tutti i confronti sono && ed.

Quindi il codice inviato viene eseguito equals() sull'oggetto dipendente e total.

10

Stavo cercando di capire come funziona CompareToBuilder e mi sono imbattuto in questo post, ma non ero soddisfatto della risposta. Ad esempio, il metodo toComparison deve restituire un numero intero negativo, un intero positivo o zero in quanto il costruttore ha giudicato il lato "sinistro" inferiore, maggiore o uguale al lato "destro".

Quindi la mia domanda era in che modo l'ordine degli attributi di aggiunta influisce sul confronto. Per rispondere a questa, l'unica cosa che potevo fare era controllare il codice sorgente e ho trovato questo:

public CompareToBuilder append(int lhs, int rhs) { 
    if (this.comparison != 0) { 
     return this; 
    } 
    this.comparison = ((lhs > rhs) ? 1 : (lhs < rhs) ? -1 : 0); 
    return this; 
} 

Quindi, in pratica ciò che sta accadendo è che confronterà gli attributi in base all'ordine te li aggiunge. Nel tuo esempio di codice, "dipendente" verrà valutato per primo. Se gli attributi del lato sinistro vengono valutati come minori o maggiori rispetto al lato destro, allora il totale viene ignorato.

L'attributo "totale" verrà valutato solo se "dipendente" è uguale.

Problemi correlati