2012-02-06 23 views
9

Me enteré de la interfaz Comparable, para la cual una clase debe implementar el método compareTo. Un proyecto en el que estoy usando ese método como:¿Qué hace exactamente 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(); 
} 

Lo exacly qué CompareToBuilder hacer aquí? ¿Y cómo está interactuando con los atributos employee y total?


leí the javadocs, pero no puedo hacer la cabeza o la cola de lo que están haciendo con el constructor y el múltiplo append s. ¿Esta pregunta indica intenciones poco claras y cero investigación?

+3

¿Es el Javadoc (http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/CompareToBuilder.html) poco claro de alguna manera? – skaffman

+2

No está claro de muchas maneras. En particular, cómo se calcula el entero resultante o cómo la secuencia de anexos afecta el valor de retorno. –

+2

Encontré esta publicación altamente informativa - http://www.codejava.net/java-core/collections/sorting-a-list-by-multiple-attributes-example – Shatu

Respuesta

4

Esta clase está destinada a ayudarle en la construcción de compareTo() -metodos. Imagine que tiene más que solo 2 campos en su clase: la codificación manual de su método de comparación puede ser bastante engorrosa.

CompareToBuilder lo está haciendo por usted: cada método append() agrega una nueva comparación, y todas las comparaciones son && ed.

Así que el código que publicó ejecuta equals() en el objeto empleado y total.

10

Estaba intentando averiguar cómo funciona CompareToBuilder y me encontré con esta publicación, pero no estaba contento con la respuesta. Por ejemplo, el método toComparison debe devolver un entero negativo, un entero positivo o cero, ya que el constructor ha juzgado el lado "izquierdo" como menor que, mayor que, o igual al lado "derecho".

Así que mi pregunta fue cómo el orden de los atributos añadidos afecta la comparación. Para responder a esto, la única cosa que podía hacer era comprobar el código fuente y me encontré con esto:

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

Así que, básicamente, lo que está sucediendo es que va a comparar los atributos basados ​​en el orden en que se anexa. En su ejemplo de código, primero se evaluará a "empleado". Si los atributos del lado izquierdo se evalúan como menores o mayores que el lado derecho, el total no se tiene en cuenta.

El atributo "total" solo se evaluará si "empleado" se evalúa como igual.

Cuestiones relacionadas