2010-03-20 20 views
13

¿Por qué tenemos equals() y equalsIgnoreCase() como dos métodos diferentes, cuando equals() podría haber sido sobrecargado con un argumento especial ignoreCase para proporcionar funcionalidad equalsIgnoreCase()?iguales (...) y equalsIgnoreCase (...)

Respuesta

16

El método equals() se hereda de Object, por lo que no debe modificarse su firma. equals() a menudo se puede utilizar sin conocer realmente la clase concreta del objeto, p. al iterar a través de una colección de objetos (especialmente antes de los genéricos de Java 5). Entonces, ni siquiera verías el otro equals() sin bajar tu objeto a String primero.

Esta fue una elección de diseño de los creadores de Java para usar el modismo de usar equals() utilizable de la misma manera para todos los objetos.

Por otra parte, la OMI

if (string1.equalsIgnoreCase(string2)) ... 

es más fácil de leer, por tanto, menos propenso a errores que

if (string1.equals(string2, true)) ... 

Por supuesto, en sus propias clases que son libres de añadir una equals() con diferentes firmas (en parte superior de la norma equals(), eso es).

+0

pero veo otras implementaciones como 'compareTo()' y 'compareToIgnoreCase()' también, que no tienen conexión con la clase 'Object' per se. –

+1

@Vaibhav Un buen diseño de API es consistente con la denominación (entre otras cosas). Si los métodos que hacen cosas similares se nombran de acuerdo con un patrón similar, la API es más fácil de aprender y usar, lo que también reduce la posibilidad de errores. Además, mi argumento de legibilidad anterior se aplica a 'compareToIgnoreCase()' así como a 'equalsIgnoreCase()'. –

1

Porque el método equals() se hereda de Object.

Si lo hicieron como sugieres entonces tendríamos algo como esto:

public final class String { 

    public boolean equals() { ... } 

    public boolean equals (boolean ignoreCase) { ... } 

} 

Y sin necesidad de leer la documentación que sería imposible de entender qué método equals() (que sin parámetros) hacer.

+1

Eso es un patrón perfectamente API común. El primer formulario usa un valor predeterminado para el argumento. Y si es imposible saber cuál es el valor predeterminado sin leer la documentación, entonces lee la documentación. – skaffman

+0

@skaffman: buenos ejemplos, por favor – Roman

+0

OK, 'java.lang.String' tiene varios constructores, muchos de los cuales son versiones más simples de otros constructores, y proporcionan valores predeterminados cuando los llaman. El comportamiento no es obvio sin mirar el javadoc. – skaffman

2

Es absolutamente posible hacer lo que usted sugiere, pero los diseñadores del lenguaje elegido para ir a otro lado y, por tanto, tenemos equalsIgnoreCase(otherString) en lugar de decir equals(otherString, StringConstants.IGNORE_CASE) o equals(otherString, true).

3

equalIgnoreCase() se utiliza para ignorar la mayúscula de mi String. Pero el equals() es sólo devuelve true, mientras que ser el mismo caso de string

ex,

String value="java"; 
if(value.equals("JAva") 
{ 
    System.out.println("Return True"); 
} 
else 
{ 
    System.out.println("Return False"); 
} 

Respuesta: Devuelve False

pero el otro es,

if(value.equalIgnoreCase("JAva") 
{ 
    System.out.println("Return True"); 
} 
else 
{ 
    System.out.println("Return False"); 
} 

Resp: Devuelve True

+4

Lea y COMPRENDA la pregunta antes de publicar una respuesta. – missingfaktor

0

Creo que eligieron una de las alternativas. .NET eligió el otro. StringComparison.InvariantCultureIgnoreCase etc.

definitivamente lo que usted está sugiriendo y [aún mejor lo que] .NET implementado habría sido más flexible para diferentes culturas, etc. De hecho, ni siquiera sé lo que la cultura que utilizan en este caso ignorar . Creo que la cultura actual.

1

La prueba principal al reemplazar un método con parámetros adicionales es que esperaría que cualquier método de anulación hiciera exactamente lo mismo que el método que está anulando. Igual(), derivado de Objeto tiene un contrato que debe seguir. Dos objetos que son iguales() deben tener hashcodes idénticos. No creo que dos objetos que no distinguen entre mayúsculas y minúsculas igual tengan el mismo código hash, por lo que creo que anular igual aquí es lo incorrecto.

1
// Demonstrate equals() and equalsIgnoreCase(). 
    class equalsDemo { 
    public static void main(String args[]) { 
    String s1 = "Hello"; 
    String s2 = "Hello"; 
    String s3 = "Good-bye"; 
    String s4 = "HELLO"; 
    System.out.println(s1 + " equals " + s2 + " -> " + 
    s1.equals(s2)); 
    System.out.println(s1 + " equals " + s3 + " -> " + 
    s1.equals(s3)); 
    System.out.println(s1 + " equals " + s4 + " -> " + 
    s1.equals(s4)); 
    System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " + 
    s1.equalsIgnoreCase(s4)); 
    } 
} 

La salida del programa se muestra aquí:

Hello equals Hello -> true 
Hello equals Good-bye -> false 
Hello equals HELLO -> false 
Hello equalsIgnoreCase HELLO -> true 
Cuestiones relacionadas