2012-08-30 16 views
5

Eventuali duplicati:
Returning false from Equals methods without Overridinguguale a restituire false

Un mio collega mi ha chiesto una domanda oggi come indicato di seguito

classe Write TestEquals (personalizzata o classe definita dall'utente) in modo che il seguente sop nel codice stampa false.

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

Nota: non è possibile ignorare uguale metodo.

Ho pensato molto ma non sono riuscito a trovare la soluzione senza prevalere uguali. Qualcuno ha idea di come possa essere fatto?

+7

Questo non è compiti? –

+4

È ** sovraccarico ** consentito? – home

+2

Il duplicato ha due downvotes e la risposta accettata solo quattro upvotes. Cosa rende la domanda molto meglio questa volta? – maba

risposta

17

uso

public boolean equals(TestEquals equals) { 
    return false 
} 

Per sovrascrivere equals è necessario il parametro di ingresso per essere di tipo di oggetto in modo che il frammento di codice di cui sopra theorectially non è prioritario è uguale dal metodo oggetto

+5

Potrebbe anche restituire un 'String' se ci si sente come esso. –

+0

Incredibile! 13 upvotes finora. – maba

+0

@DuncanJones buon punto non pensavo che +1 per averlo indicato – RNJ

0

Non so perché sarebbe qualcuno vuole farlo. Ma è possibile creare un metodo come illustrato di seguito:

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

Dove SuperEquals è un qualsiasi superclasse di TestEquals ma non Object.

1

Come accennato in precedenza, si potrebbe scrivere un metodo in questo modo:

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

Inoltre, se TestEquals può estendere qualche altro oggetto:

public TestEquals extends Something { 
} 

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

EDIT: A quanto pare someone else arrivato a questa idea prima su un altro thread, ma lascerò questo qui poiché questo codice è significativamente più semplice.


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); 
     } 
     } 
    })); 
    } 
} 

Questo orribile mod non escludere o sovraccaricare nulla a che fare con equals, ma l'atto di creazione di un'istanza di TestEquals provoca la classe per caricare che avvolge System.out in modo che ogni stampa successiva che inizia con 't' causerà la stampa di "false" invece dei primi 4 byte. (Supponendo che la codifica predefinita non sia qualcosa di super-esotico.)

+0

Idea eccellente :) – gontard

+0

+1 per pensare fuori dagli schemi. – maba

-1

Sul mio iPad ... La strategia dovrebbe essere qualcosa come avere un attributo aun che viene modificato ogni volta che si esegue un get su di esso..questo funzionerà se il l'attributo è accessibile tramite il getter su uguali. Si dice che gli uguali non possono essere sovrascritti, quindi l'attributo deve essere privato e la modifica del valore avviene prima e dopo la lettura del valore, per assicurarsi che funzioni indipendentemente dal fatto che sia la prima o la seconda parte degli uguali.

Qualcosa di simile (dispiace per eventuali errori di sintassi):

public class TestEquals{ 

private int id; 

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

Il primo controllo in Object.equals (Object obj) è 'if (this == obj) return true'. –

Problemi correlati