2012-08-30 12 views
5

Duplicar posibles:
Returning false from Equals methods without Overridinges igual a devolver false

Uno de mi colega me hizo una pregunta hoy en día como se menciona más adelante

clase TestEquals escritura (la costumbre o la clase definida por el usuario) para que el sop más abajo en el código imprima false.

public class Puzzle3 { 
    public static void main(String[] args) { 
    TestEquals testEquals = new TestEquals(); 
    System.out.println(testEquals.equals(testEquals)); 
    } 
} 

Nota: No se puede reemplazar es igual método.

Pensé mucho pero no pude encontrar la solución sin sobrepasar a los iguales. ¿Alguien tiene alguna idea de cómo se puede hacer?

+7

Esto no es tarea? –

+4

¿Se permite ** la sobrecarga **? – home

+2

El duplicado recibió dos votos abajo y la respuesta aceptada solo cuatro votos por adelantado. ¿Qué hace que la pregunta sea mucho mejor esta vez? – maba

Respuesta

17

uso

public boolean equals(TestEquals equals) { 
    return false 
} 

Para sobrescribir equals necesita el parámetro de entrada a ser de tipo de objeto por lo que el fragmento de código anterior theorectially no es primordial es igual al método de objeto

+5

También podría devolver un 'String' si le daba la gana. –

+0

¡Increíble! 13 upvotes hasta el momento. – maba

+0

@DuncanJones buen punto que no pensé en ese +1 para señalar – RNJ

0

No sé qué haría cualquiera quiere hacer eso. Sin embargo, puede crear un método como se muestra a continuación:

public boolean equals(SuperEquals equals) { return false; } 

Dónde SuperEquals es cualquier superclase de TestEquals pero no Object.

1

Como se mencionó anteriormente, se podría escribir un método de este modo:

public boolean equals(TestEquals e) { 
    return false; 
} 

Además, si TestEquals puede extender algún otro objeto:

public TestEquals extends Something { 
} 

public Something { 
    @Override public boolean equals(Object o) { 
     return false; 
    } 
} 
11

EDIT: Al parecer someone else llegaron a esta idea primero en otro hilo, pero lo dejaré aquí ya que este código es significativamente más simple.


class TestEquals { 

    static { 
    System.setOut(new PrintStream(new FilterOutputStream(System.out) { 
     public void write(byte[] buf, int pos, int len) throws IOException { 
     if (len >= 4 && buf[pos] == 't') { 
      out.write(new byte[] { 
       (byte) 'f', (byte) 'a', (byte) 'l', (byte) 's', (byte) 'e' 
      }); 
      out.write(buf, pos + 4, len - 4); 
     } else { 
      out.write(buf, pos, len); 
     } 
     } 
    })); 
    } 
} 

Esta horrible truco, no se anula o sobrecargar nada que ver con equals, pero el acto de crear una instancia de TestEquals hace que la clase de carga que envuelve System.out de manera que cualquier impresión posterior que comienza con 't' hará que se imprima "false" en lugar de los primeros 4 bytes. (Suponiendo que la codificación predeterminada no es algo súper exótico.)

+0

idea excelente :) – gontard

+0

+1 para pensar fuera de la caja. – maba

-1

En mi iPad ... La estrategia debería ser algo así como tener un atributo que se modifique cada vez que lo haga ... esto funcionará si el atributo se accede a través del getter en iguales. Menciona que los iguales no pueden anularse, por lo que el atributo debe ser privado y la modificación del valor debe ocurrir antes y después de leer el valor, para asegurarse de que funciona independientemente de si es la primera o la segunda parte de los iguales.

Algo así (lo siento por los errores de sintaxis):

public class TestEquals{ 

private int id; 

public int getId(){ 
    int temp; 
    id++; 
    temp=id; 
    id++; 
    return temp; 
} 
} 
+0

El primer control en Object.equals (Object obj) es 'if (this == obj) return true'. –