sustitucion sistema siguientes resuelve reduccion por paso metodos metodo lineales las julioprofe igualacion eliminacion ejemplos ecuaciones java oop

java - sistema - Anulando el método de igualdad versus creando un nuevo método



sistema de ecuaciones (7)

@David Schlosnagle menciones menciona Java efectiva de Josh Bloch: esta es una lectura obligada para cualquier desarrollador de Java.

Hay un problema relacionado: para objetos de valor inmutables, también debería considerar anular compare_to . La redacción estándar para si difieren es en la API comparable :

En general, es el caso, pero no estrictamente obligatorio (compare (x, y) == 0) == (x.equals (y)). En términos generales, cualquier comparador que viole esta condición debe indicar claramente este hecho. El lenguaje recomendado es "Nota: este comparador impone ordenamientos que son inconsistentes con los iguales".

Siempre he pensado que el método .equals () en java debe ser reemplazado para ser específico a la clase que ha creado. En otras palabras, buscar la equivalencia de dos instancias diferentes en lugar de dos referencias a la misma instancia. Sin embargo, me he encontrado con otros programadores que parecen pensar que el comportamiento por defecto del objeto debería dejarse en paz y que se creó un nuevo método para probar la equivalencia de dos objetos de la misma clase.

¿Cuáles son los argumentos a favor y en contra de anular el método de iguales?


Debería "nunca" anular equals & getHashCode para objetos mutables; esto vale para .net y Java ambos. Si lo hace, y utiliza un objeto como la clave en f.ex un diccionario y luego cambia ese objeto, tendrá problemas porque el diccionario se basa en el código hash para encontrar el objeto.

Aquí hay un buen artículo sobre el tema: http://weblogs.asp.net/bleroy/archive/2004/12/15/316601.aspx


El método Equals está destinado a comparar referencias. Por lo tanto, no se debe modificar su comportamiento.

Debería crear un nuevo método para probar la equivalencia en diferentes instancias si lo necesita (o usar el método CompareTo en algunas clases .NET)


La anulación del método equals es necesaria si desea probar la equivalencia en clases de biblioteca estándar (por ejemplo, garantizar que java.util.Set contenga elementos únicos o que use objetos como claves en objetos java.util.Map).

Tenga en cuenta que si anula las equivalentes, asegúrese de respetar el contrato de la API tal como se describe en la documentación. Por ejemplo, asegúrese de anular también Object.hashCode :

Si dos objetos son iguales de acuerdo con el método equals (Object), entonces llamar al método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.

EDITAR: No publiqué esto como una respuesta completa sobre el tema, por lo que me haré eco de la afirmación de Fredrik Kalseth de que prevalecer sobre iguales funciona mejor para objetos inmutables . Para citar la API para el mapa :

Nota: se debe tener mucho cuidado si los objetos mutables se utilizan como claves de mapa. El comportamiento de un mapa no se especifica si el valor de un objeto se cambia de una manera que afecta a las comparaciones iguales mientras el objeto es una clave en el mapa.


Para ser honesto, en Java no existe realmente un argumento en contra de anular Iguales . Si necesita comparar instancias para la igualdad, entonces eso es lo que hace.

Como se mencionó anteriormente, debe tener en cuenta el contrato con hashCode y, de manera similar, tener cuidado con los errores encontrados en la interfaz Comparable ; en casi todas las situaciones, desea que el ordenamiento natural definido por Comparable sea consistente con iguales (consulte el BigDecimal api doc para el ejemplo del contador canónico)

Crear un nuevo método para decidir la igualdad, aparte de no trabajar con las clases de biblioteca existentes, contradice en cierto modo la convención de Java.


Recomiendo encarecidamente recoger una copia de Java efectivo y leer el artículo 7 obedeciendo el contrato de igualdad . Debe tener cuidado si está anulando iguales para objetos mutables, ya que muchas de las colecciones como Maps y Sets usan iguales para determinar la equivalencia, y la mutación de un objeto contenido en una colección podría generar resultados inesperados. Brian Goetz también tiene una muy buena visión general de la implementación de iguales y hashCode .


Solo debe reemplazar el método equals() si desea un comportamiento específico al agregar objetos a las estructuras de datos ordenados ( SortedSet etc.)

Cuando lo haga, también debe anular hashCode() .

Vea aquí para una explicación completa.