java - metodo - ¿Se pueden anular los.equals de manera tal que a.equals(a) devuelva false?
metodo equals string java (5)
Entero a.equals (a) puede devolver falso
Pero debes ser realmente malvado y usar reflexiones y subprocesos múltiples:
Si ejecuta este código, existe la posibilidad de que una condición de carrera pueda cambiar el valor interno de myInt
mientras se lleva a cabo la comparación. Si desea simular esta condición, simplemente configure un punto de interrupción dentro de Integer.intValue()
ejecute el código en depuración y presione continuar. Esto creará un retraso que crea artificialmente la condición de carrera y la consola devolverá falso.
class IntegerEqualsTest
{
public static void main( final String[] args )
{
final Integer myInt = new Integer( 420 );
new Thread() {
public void run() {
try {
final Field f = Integer.class.getDeclaredField( "value" );
f.setAccessible( true );
f.setInt( myInt, 100 );
} catch( final Exception e ) {}
}; }.start();
System.out.println( myInt.equals( myInt ) );
}
}
Todavía estoy bastante fresco con todo esto, pero estoy trabajando para obtener mi certificación OCAJP (Java). Recordé haber leído anteriormente que el método .equals podría ser anulado cuando llegué a esta pregunta:
Ahora estas preguntas han sido bastante malas por lo que a mí respecta. Torciendo cada pequeña cosa que crees saber para forzarte a aprender todas las minucias. Ahora había adivinado E, pero no creía que D estuviera en lo correcto. Me refiero al 99.9% de las veces, por supuesto, pero pensé que era una pregunta trampa basada en la redacción.
Esto me hizo pensar, ¿es cierto? Quiero decir, si obtengo la pregunta en el examen, sé cómo responderla ahora, pero en el profundo y oscuro abismo de la locura primordial, ¿es posible crear una situación en la que a.equals (a) devuelva falso? Siento que esto enojaría a Aristóteles ...
Como equals(...)
no es un método final de Object
, sí, es muy posible que sea en una situación diferente .
@Override
public boolean equals(Object obj) {
return false;
}
Esta pregunta, sin embargo, dice específicamente que estos son envoltorios primitivos (por ejemplo, Integer , Boolean , etc.) y dado que estas clases son finales, no puede extenderlas, por lo tanto, a.equals(a)
siempre devolverá true
.
Las otras respuestas ya han respondido a su pregunta, no, esto no es posible con las clases de envoltura primitiva de Java.
Trataré de abordar la "pregunta detrás de la pregunta": ¿Esto es posible con otras clases?
[...] en el profundo y oscuro abismo de la locura primordial, ¿es posible crear una situación donde a.equals (a) devuelve false? Siento que esto enojaría a Aristóteles ...
Esta es realmente una buena pregunta, y la respuesta es: Sí, es posible crear una situación así, y sí, enojaría a Aristóteles. En realidad, no sé si enojaría a Aristóteles, sin haberlo conocido, pero sin duda causará mucho dolor a cualquiera que tenga que trabajar con el código.
Lo que pasa es que hay un contrato asociado con Object.equals()
:
El método equals implementa una relación de equivalencia en referencias de objetos no nulos:
[...]
Es reflexivo: para cualquier valor de referencia no nulo x, x.equals (x) debería devolver verdadero.
Sí, al crear su propia clase, puede violar este contrato. No hay (desafortunadamente) nada en el compilador o tiempo de ejecución que lo detenga.
Sin embargo, una gran cantidad de código se basa en este contrato, por lo que si lo viola, cualquier código que use equals
probablemente fallará de manera misteriosa.
Un ejemplo: las clases de colección propias de Java ( java.util.Collection
y friends) se basan en equals
. Si una instancia de una clase que no implementa correctamente equals
se coloca en una colección, suceden cosas extrañas, como la colección que a veces contiene la instancia y otras veces no.
Puedes echar un vistazo a las implementaciones de todas las envolturas primitivas, es decir: Integer, Boolean, Character, etc. Verás que la implementación es correcta.
La razón es que con los iguales, una vez que se realizan las verificaciones, se comprueba la igualdad de referencia y x.equals (x) ya que tanto el objeto como el argumento son el mismo objeto.
Tenga en cuenta que a
. b
son instancias de clases primitivas de envoltura (como Integer, Double, etc ...). Estas clases son finales y no se pueden extender, por lo que no puede anular su implementación equals
.
Por a.equals(a)
tanto, a.equals(a)
siempre será verdadero, ya que esas clases implementan equals
correctamente.